我有一个文件global.h
,它包含在项目中的许多文件中,并包含常规标题。文件的相关内容如下:
#define DEBUG
#ifdef DEBUG
extern int debug_level;
#endif
它已包含在main.c
中,并且警告对应main.c
#ifdef DEBUG
debug_level = 6; //compiler generates warning corresponding to this line.
#endif
编译器发出的警告消息是:
src/main.c:14:1: warning: data definition has no type or storage class [enabled by default]
src/main.c:14:1: warning: type defaults to ‘int’ in declaration of ‘debug_level’ [enabled by default]
我不明白我做错了什么。令人惊讶的是程序工作正常,因为我认为编译器假定该数字是int
(默认情况下)。
答案 0 :(得分:2)
您应该将int
定义为
#ifdef DEBUG
int debug_level = 6; //define as int
#endif
使用您的代码,其隐式定义为int
,因此警告。
extern int debug_level;
不是定义,而是宣言。
答案 1 :(得分:1)
您不能只在全局范围内设置变量,实际上您已经在头文件中创建了与声明匹配的定义:
#ifdef DEBUG
int debug_level = 6;
#endif
答案 2 :(得分:1)
如果已将变量debug_level
声明为其他地方,则将其声明为external
。然后编译器也会在其他地方查找声明。
#ifdef DEBUG
external int debug_level = 6;
#endif