头文件中的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 */ 

我所看到的唯一的缺点是,如果在同一个文件中包含两次,包含后卫并不能保存你。