c语言 - 多个定义,即使我使用 extern 并包括守卫



这是我的头文件。

#ifndef P6_H
#define P6_H

#include <stdio.h>
void FoundationC();      
void StructureC();       
void PlumbingC();        
void ElectricC();        
void HVACC();            
void SheatingC();        

extern int DAYS;          
#endif

我正在使用makefile来完成所有的编译。它可以编译单独的.o文件文件,但当它试图将这些文件转换为一个可执行文件时,它会说变量DAYS有多个定义,尽管它是外部的,并且在每个文件中单独声明和初始化。我以前有这个功能,但不明白为什么现在不起作用。哦,这是我的makefile代码

all:
    gcc -c P6.c
    gcc -c foundations.c
    gcc -c structure.c
    gcc -c plumbing.c
    gcc -c electric.c
    gcc -c hvac.c
    gcc -c sheating.c
    gcc  P6.h P6.o foundations.o structure.o plumbing.o electric.o hvac.o sheating.o -o P6

我意识到P6.h可能不必包含在命令中,但包含的警卫应该让它无关紧要?

如果这个问题是个骗局,我也很抱歉,但我之前确实在寻找答案,尽管这是为学校准备的,但这个问题在个人层面上让我抓狂。

以下是我得到的错误。

gcc -c P6.c
gcc -c foundations.c
gcc -c structure.c
gcc -c plumbing.c
gcc -c electric.c
gcc -c hvac.c
gcc -c sheating.c
gcc  P6.h P6.o foundations.o structure.o plumbing.o electric.o hvac.o sheating.o -o P6
structure.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
plumbing.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
electric.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
hvac.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
sheating.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
collect2: error: ld returned 1 exit status
make: *** [all] Error 1

为了帮助您理解,以下是@FUZxxl答案的扩展,这是正确的。如果您的编译单元中有以下内容(编译单元是.c源文件加上所有包含的.h文件):

extern int DAYS;
...
int DAYS = 1;

则CCD_ 1的第二声明覆盖声明其为CCD_。因此,变量现在不再是extern,如果在多个源文件中执行此操作,那么现在将有多个定义,并且链接器会抱怨。

如果必须初始化DAYS,那么可以在一个位置执行,最好是在主文件中。

每个单独初始化。

这是你的错误。如果你用不同的翻译单位初始化同一个变量,你认为会发生什么?如果这些使用不同的值,你认为会发生什么?

在程序中只能定义一个变量一次,不过可以使用多个声明。从除一个翻译单元外的所有翻译单元中,删除DAYS的定义以解决此问题。

首先,从makefile中的最后一个命令中删除P6.h-gcc中的o选项用于编译和链接多个源文件。所以,这没有任何意义。

其次,在.c文件中将DAYS定义为"int DAYS",您可以在相应的.h文件中将其声明为extern,并将该.h文件包含在所有其他源.c文件中。这将解决多个定义的问题。示例:在A.c中将天定义为"int days",然后在A.h中将其声明为"extern int days"。现在,您可以将此A.h包含在其他源文件中,如B.c、c.c、D.c等。

相关内容

  • 没有找到相关文章

最新更新