头文件中的variables声明
如果我有一个variables,可能在几个来源使用 – 是一个很好的做法,在一个头部声明? 还是最好在.c
文件中声明并在其他文件中使用extern
?
你应该在头文件中声明variables:
extern int x;
然后在一个 C文件中定义它:
int x;
在C语言中,定义和声明之间的区别在于,定义为variables保留了空间,而声明只是将variables引入到符号表中(并且在链接时间时会导致链接器去查找它) 。
您可以(应)在头文件中将其声明为extern
,并将其定义在1.c文件中。
请注意,.c文件也应该使用标题,标准模式如下所示:
// file.h extern int x; // declaration // file.c #include "file.h" int x = 1; // definition and re-declaration
如果你宣布它像
int x;
在一个包含在多个位置的头文件中,最后会有多个x实例(以及潜在的编译或链接问题)。
解决这个问题的正确方法是让头文件说出来
extern int x; /* declared in foo.c */
然后在foo.c中可以这样说
int x; /* exported in foo.h */
你可以在任意位置包含头文件。
关键是保持头文件和源文件中variables的声明一致。
我使用这个技巧
------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只编译一次,它定义了variables。 任何包含sample.h的文件只会被赋予variables的“extern”; 它确实为该variables分配空间。
当你改变x的types时,它会改变每个人。 您不需要记住在源文件和头文件中更改它。
这个解决scheme呢?
#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 */
我所看到的唯一的缺点是,如果在同一个文件中包含两次,包含后卫并不能保存你。