如果我有一个可以在多个来源中使用的变量 - 在标题中声明它是一个好习惯吗?或者最好在.c
文件中声明它并在其他文件中使用extern
?
答案 0 :(得分:98)
你应该在头文件中声明变量:
extern int x;
然后在一个 C文件中定义:
int x;
在C中,定义和声明之间的区别在于定义为变量保留了空间,而声明只是将变量引入到符号表中(并且会导致链接器在查找时查找它)链接时间)。
答案 1 :(得分:34)
您可以(应该)在头文件中将其声明为extern
,并在1 .c文件中进行定义。
请注意,该.c文件也应使用标头,标准模式如下:
// file.h
extern int x; // declaration
// file.c
#include "file.h"
int x = 1; // definition and re-declaration
答案 2 :(得分:10)
如果你声明它
int x;
在一个头文件中,然后包含在多个地方,你最终会得到多个x实例(可能会编译或链接问题)。
正确的方法是让头文件说
extern int x; /* declared in foo.c */
然后在foo.c中你可以说
int x; /* exported in foo.h */
您可以将头文件包含在任意数量的地方。
答案 3 :(得分:3)
关键是要保持头文件和源文件中变量的声明相同。
我使用这个技巧
------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的类型时,它会为每个人改变。您无需记住在源文件和头文件中更改它。
答案 4 :(得分:-1)
这个解决方案怎么样?
#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 */
我看到的唯一缺点是,如果你在同一个文件中包含两次,那么包含守卫就不能保存你。