Pergunta

Por exemplo:

code1.c / .cpp

int a;

// ... and so on

code2.c / .cpp

int a;

int main(void) {
    return 0;
}

vá para compilar:

$gcc code1.c code2.c      # this is fine
$

$g++ code1.cpp code2.cpp  # this is dead
/tmp/ccLY66HQ.o:(.bss+0x0): multiple definition of `a'
/tmp/ccnIOmPC.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status

Existe alguma diferença de ligação de variável global entre C e C ++?

Foi útil?

Solução

Não é estritamente legal.int a; é uma definição provisória em C. São permitidas várias definições provisórias e no máximo uma definição não provisória por unidade de tradução de cada objeto com ligação externa em C, mas apenas uma definição em todas as unidades de tradução em um programa.

É uma extensão comumente implementada para permitir definições provisórias em várias unidades de tradução em C, desde que não mais de uma unidade de tradução contenha uma definição não provisória, mas não seja estritamente padrão.

Em C ++, int a; é apenas uma definição - não há conceito de tentativa - e ainda é ilegal ter várias definições de um objeto nas unidades de tradução de um programa.

Para o caso C, você pode consultar esta pergunta .

Outras dicas

É ilegal em ambos, mas os compiladores C geralmente implementam uma extensão.Veja esta resposta .

Existem três maneiras de resolver o problema:

  1. Se a variável a for a mesma em ambos os arquivos, você deve declará-la como extern em todos os arquivos, exceto um.A palavra-chave extern diz ao vinculador que esse nome está localizado em outros arquivos.

  2. Você pode usar a palavra-chave static para limitar o escopo da variável a um arquivo.Em que é declarado.

  3. Ou você pode usar um namespace sem nome.

O compilador g ++ é mais estrito que o compilador gcc. Também depende da versão do gcc, pode ser uma versão superior do gcc, ou seja, 4.X em diante, pode dar o mesmo erro.

Use extern para evitar

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top