gcc错误:未定义对的引用***

gcc错误:未定义对的引用***,c,gcc,C,Gcc,在我的main.c文件中,我将NUMBER定义为: #define NUMBER '0' 在另一个.c文件2中,我将其声明为“extern int”变量并使用它。但在编译gcc时,会出现以下错误消息: /tmp/ccsIkxdR.o: In function `file2': file2.c:(.text+0xfd): undefined reference to `NUMBER' collect2: error: ld returned 1 exit status 请给我建议一条出路。提前

在我的main.c文件中,我将
NUMBER
定义为:

#define NUMBER '0'
在另一个.c文件2中,我将其声明为“extern int”变量并使用它。但在编译gcc时,会出现以下错误消息:

/tmp/ccsIkxdR.o: In function `file2':
file2.c:(.text+0xfd): undefined reference to `NUMBER'
collect2: error: ld returned 1 exit status
请给我建议一条出路。提前感谢。

当您使用
时,define
是为前置处理器定义一个宏。此宏仅在定义它的源文件中可见。没有其他源文件会看到此宏定义,并且预处理器将无法在其他源文件中为您展开宏,因此编译器会看到符号
编号
,并且没有任何此类符号的声明

要解决此问题,您有两个选择:

  • 将宏放入包含在两个源文件中的头文件中
  • NUMBER
    定义为适当的变量而不是宏,然后在另一个源文件中使用
    extern
    声明
  • 当您在C文件中定义某个内容(即创建一个预处理器宏)时,它作为文本替换,而不是变量的声明。因此,当您编写
    #时,定义数字“0”
    并编写
    外部整数之后,编译器将其转换为
    extern int“0”
    如果要定义常数并从其他位置访问它,可以编写:

    const int NUMBER = '0';
    


    由于您的
    编号
    属于
    int
    类型,因此可以将其声明为枚举常量:

    enum { NUMBER = '0' };
    

    您必须将其放在头文件(.h)中,并将该头文件包含在编译单元(.c文件)中。

    很好地解释了为什么它不起作用。对如何修复有何评论?
    enum { NUMBER = '0' };