Pergunta

Meu conhecimento muito básico de C e processo de compilação tem enferrujado ido recentemente. Eu estava tentando descobrir resposta para a seguinte pergunta, mas eu poderia compilação não conexão, de ligação e de pré-processamento básico de fase. Uma busca rápida no Google não ajudou muito. Então, eu decidi vir para a última fonte de conhecimento :)

eu sei: Variáveis ??não deve ser definido nos arquivos .h. O seu ok para declará-los lá.

Por:. Porque um arquivo de cabeçalho pode ser incluído a partir de vários lugares, redefinindo, assim, a variável mais de uma vez (Linker dá o erro)

Possível solução alternativa:. Use header-guardas em arquivos de cabeçalho e definir variáveis ??em que

É realmente uma solução: Não. Porque header-guardas são para pré-processamento de fase. Isso quer dizer compilador que essa parte já foi incluído e não incluí-lo mais uma vez. Mas nosso erro definição múltipla vem na parte vinculador -. Muito após a compilação

Essa coisa toda tem me confundido sobre como pré-processamento e ligando trabalho. Eu pensei que o pré-processamento só não vai incluir o código, se o símbolo guarda cabeçalho foi definido. Nesse caso, não deve múltipla definição de um problema variável também são resolvidos?

O que acontece que estas directivas de pré-processamento salvar o processo de compilação de redefinição símbolos sob os guardas de cabeçalho, mas o vinculador ainda recebe várias definições do símbolo?

Foi útil?

Solução

Header guarda protege de várias inclusões em um único arquivo de origem, não a partir de vários arquivos de origem. Eu acho que o problema decorre de não entender este conceito.

Não é que os guardas pré-processador está salvando durante o tempo de compilação deste problema. Na verdade, durante o tempo de compilação, um único arquivo fonte é compilado em um obj, definições de símbolos não são resolvidos. Mas, no caso de ligar quando as tentativas de vinculador para resolver a definição dada símbolo, ele fica confuso vendo mais de uma definição alguma causando-lo para sinalizar o erro.

Outras dicas

Uma coisa que eu usei no passado (quando variáveis ??globais estavam em voga):

arquivo var.h:

...
#ifdef DEFINE_GLOBALS
#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN int global1;
EXTERN int global2;
...

Então, em um C arquivo (normalmente a que contém main ()):

#define DEFINE_GLOBALS
#include "var.h"

O restante dos arquivos de origem apenas incluem "var.h" normalmente.

Observe que DEFINE_GLOBALS não é um guarda de cabeçalho, mas sim permite declarar / definir as variáveis, dependendo se ele é definido. Esta técnica permite uma cópia das declarações / definições.

Você tem dois arquivos .c. Eles são compilados separadamente . Cada uma inclui o seu arquivo de cabeçalho. Uma vez. Cada um recebe uma definição. Eles conflito em tempo de ligação.

A solução convencional é:

#ifdef DEFINE_SOMETHING
int something = 0;
#endif

Então você #define DEFINE_SOMETHING em apenas um arquivo .c .

guardas de cabeçalho para um arquivo de cabeçalho que está sendo incluído várias vezes na mesma unidade de tradução (ou seja, no mesmo arquivo fonte .c). Eles não têm nenhum efeito se você incluir o arquivo em duas ou mais unidades de tradução.

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