在C语言中,声明 (declaration) 和 定义 (definition) 是有区别的。
示例:
// 声明 (extern) extern int global_var; int func(int); // 定义 int global_var = 42; int func(int x) { return x * 2; }
在多模块项目中,声明放在头文件中,以便模块 "相互了解",而定义仅放在一个源文件中,以避免在链接时发生冲突。
在不同的源文件中,如果它们包含同一个头文件,是否可以有多个相同变量的定义(例如 int flag = 0;)?
答复:不可以!头文件应仅包含声明 extern int flag;,而变量的定义应仅放在一个源文件中 (int flag = 0;)。不遵守将导致关于多重定义的链接器错误。
故事
在一个大型项目中,“分割”了全局变量,把它们放在头文件中作为
int counter = 0;。通过include包含这个头文件,导致定义重复。结果:在CI/CD构建时,链接器错误——“多个counter的定义”。
故事
在函数库中制作了函数的原型,但没有指定类型,结果编译器将其视为过时的声明,并在模块之间函数签名不匹配时给出了错误。
故事
在测试阶段发现某些变量未初始化,因为它们仅被声明为
extern,但没有任何模块进行了初始化。这导致读取垃圾值和在嵌入式平台上出现难以捕捉的bug。