Variable declaration in a header file
本问题已经有最佳答案,请猛点这里访问。
如果我有一个变量可以在多个源中使用,那么在头中声明它是一个好的实践吗?还是在
您应该在头文件中声明变量:
1 | extern int x; |
然后在一个C文件中定义它:
1 | int x; |
在C语言中,定义和声明之间的区别在于定义为变量保留了空间,而声明只是将变量引入符号表中(当涉及到链接时间时,将导致链接器查找变量)。
您可以(应该)在头文件中声明为
请注意,.c文件也应该使用头文件,并且标准模式如下所示:
1 2 3 4 5 6 | // file.h extern int x; // declaration // file.c #include"file.h" int x = 1; // definition and re-declaration |
如果你像这样宣布
1 | int x; |
在一个包含在多个地方的头文件中,您将得到X的多个实例(以及可能的编译或链接问题)。
正确的方法是让头文件
1 | extern int x; /* declared in foo.c */ |
然后在foo.c你可以说
1 | int x; /* exported in foo.h */ |
然后您可以在任意多个地方包含您的头文件。
关键是保持头文件和源文件中变量的声明相同。
我用这个技巧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ------sample.c------ #define sample_c #include sample.h (rest of sample .c) ------sample.h------ #ifdef sample_c #define EXTERN #else #define EXTERN extern #endif EXTERN int x; |
sample.c只编译一次,它定义变量。任何包含sample.h的文件都只提供变量的"extern";它确实为该变量分配了空间。
当你改变X的类型时,每个人都会改变。您不需要记住在源文件和头文件中更改它。
这个解决方案怎么样?
1 2 3 4 5 6 7 8 9 10 11 12 | #ifndef VERSION_H #define VERSION_H static const char SVER[] ="14.2.1"; static const char AVER[] ="1.1.0.0"; #else extern static const char SVER[]; extern static const char AVER[]; #endif /*VERSION_H */ |
我看到的唯一回退是,如果在同一个文件中包含两次,include guard不会保存您。