2014-10-06 111 views
1

在我的主要.c文件,我已经定义NUMBER为:GCC错误:未定义参考***

#define NUMBER '0' 

在另一个的.c文件2,我已经宣布它作为一个“外部INT”变量,使用它。但在编译gcc时出现以下错误消息:

/tmp/ccsIkxdR.o: In function `file2': 
file2.c:(.text+0xfd): undefined reference to `NUMBER' 
collect2: error: ld returned 1 exit status 

请给我一个建议。提前致谢。

回答

7

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

为了解决这个问题,你有两个选择:

  1. 把宏,你在这两个源文件包含一个头文件。
  2. NUMBER定义为一个适当的变量而不是宏,然后在另一个源文件中有一个extern声明。
+1

很好的解释为什么它不起作用。有关如何解决它的任何评论? – 2014-10-06 14:00:14

+2

@KlasLindbäck是的,用两种解决方案更新了我的答案。 :) – 2014-10-06 14:11:07

4

当你#define东西(即创建一个预处理器宏)在C文件中,它可以作为文本替换,这是不是变量的声明。所以,当你编写#define NUMBER '0'并在稍后编写extern int NUMBER;时,编译器在编译之前将其转换为extern int '0';,这是相当无意义和错误的。

如果你要定义一个常量,从其他地方访问它,你可以这样写:

const int NUMBER = '0'; 

extern int NUMBER; 
0

由于您NUMBERint类型的,你可以声明它作为一个枚举常数:

enum { NUMBER = '0' }; 

你会有t把它放在一个头文件(.h)中,并将这个头文件包含在你的编译单元(.c文件)中。