如果我有一个可以在多个源中使用的变量——在头中声明它是一个好的实践吗?还是在 .c文件中声明它,在其他文件中使用 extern更好?
.c
extern
您应该在头文件中将其声明为 extern,并在1.c 文件中对其进行精确定义。
注意,. c 文件也应该使用头部,因此标准模式如下:
// file.h extern int x; // declaration // file.c #include "file.h" int x = 1; // definition and re-declaration
重新定义是一个错误,但重新声明是可以的,通常是必要的。
你应该 声明头文件中的变量:
extern int x;
然后 定义它在 一 C 文件:
int x;
在 C 语言中,定义和声明的区别在于定义为变量保留了空间,而声明只是将变量引入符号表中(并导致链接器在链接时间到来时查找它)。
如果你声明
在一个头文件中,然后包含在多个位置,您最终将得到多个 x 实例(以及潜在的编译或链接问题)。
解决这个问题的正确方法是让头文件说
extern int x; /* declared in foo.c */
然后在 fo.c 你可以说
int x; /* exported in foo.h */
然后,您可以在任意多的位置包含您的头文件。
关键是保持头文件和源文件中变量的声明相同。
我用这招
------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;
C 只编译一次,它定义了变量。任何包含 sample.h 的文件都只被赋予变量的“外部”; 它确实为该变量分配了空间。
当你改变 x 的类型时,每个人都会改变。您不需要记住在源文件和头文件中更改它。
那这个解决方案呢?
#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,它就不会保存您。