Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Damiluke

multiple definition of

Recommended Posts

Olá, boa noite.

Tenho um programa com dois ficheiros:

 

main.c

 

CODE
#include <stdio.h>

#include <stdlib.h>

#include "configs.c"

 

int main(int argc, char *argv[])

{

printf("Idade: %d", idade);

system("PAUSE");

return 0;

}

 

e configs.c

 

CODE
int idade = 10;

Quando faço compile & run é-me apresentada a seguinte mensagem: multiple definition of 'idade'. Alguem me pode explicar porque isto acontece. Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque você definiu a variável idade mais de 1 vez...

Não sei p/ que você tem um .c com apenas uma variável. Deixa ela no main mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque você definiu a variável idade mais de 1 vez...

Não sei p/ que você tem um .c com apenas uma variável. Deixa ela no main mesmo.

Não, a variavel 'idade' apenas se encontra definida no ficheiro configs.c.

A ideia de colocar uma unica variavel no ficheiro configs.c foi apenas para exemplificar. A ideia era colocar nesse ficheiro todas as constantes e todas as variáveis globais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

....É a tradução literal do erro.

 

Vou te mostrar como você definiu mais de uma vez a idade:tem a ver com a tabela de símbolos que o compilador usa p/ criar os executáveis.

 

configs.o

 

Sections:

Idx Name Size VMA LMA File off Algn

0 .text 00000000 00000000 00000000 00000034 2**2

CONTENTS, ALLOC, LOAD, READONLY, CODE

1 .data 00000004 00000000 00000000 00000034 2**2

CONTENTS, ALLOC, LOAD, DATA

2 .bss 00000000 00000000 00000000 00000038 2**2

ALLOC

3 .comment 0000001d 00000000 00000000 00000038 2**0

CONTENTS, READONLY

4 .note.GNU-stack 00000000 00000000 00000000 00000055 2**0

CONTENTS, READONLY

SYMBOL TABLE:

00000000 l df *ABS* 00000000 configs.c

00000000 l d .text 00000000 .text

00000000 l d .data 00000000 .data

00000000 l d .bss 00000000 .bss

00000000 l d .note.GNU-stack 00000000 .note.GNU-stack

00000000 l d .comment 00000000 .comment

00000000 g O .data 00000004 idade

 

 

main.o

 

Sections:

Idx Name Size VMA LMA File off Algn

0 .text 0000002f 00000000 00000000 00000034 2**2

CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE

1 .data 00000004 00000000 00000000 00000064 2**2

CONTENTS, ALLOC, LOAD, DATA

2 .bss 00000000 00000000 00000000 00000068 2**2

ALLOC

3 .rodata 00000004 00000000 00000000 00000068 2**0

CONTENTS, ALLOC, LOAD, READONLY, DATA

4 .comment 0000001d 00000000 00000000 0000006c 2**0

CONTENTS, READONLY

5 .note.GNU-stack 00000000 00000000 00000000 00000089 2**0

CONTENTS, READONLY

SYMBOL TABLE:

00000000 l df *ABS* 00000000 main.c

00000000 l d .text 00000000 .text

00000000 l d .data 00000000 .data

00000000 l d .bss 00000000 .bss

00000000 l d .rodata 00000000 .rodata

00000000 l d .note.GNU-stack 00000000 .note.GNU-stack

00000000 l d .comment 00000000 .comment

00000000 g O .data 00000004 idade

00000000 g F .text 0000002f main

00000000 *UND* 00000000 printf

 

Quando você compila os dois .c e ainda coloca o .h dentro do main.c você está definindo duplamente a variável idade,sim. Simplesmente porque a grosso modo o include vai copiar o conteudo do .c e durante a fase de linkagem o compilador vai achar duas referências à variável idade. Se esse Compile & Run compila o projeto inteiro e não somente o fonte ativo,isso já era de se esperar, já que incluindo num .h ou compilando somente o main.c o erro não ocorre.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.