头文件中的变量声明

如果我有一个可以在多个源中使用的变量——在头中声明它是一个好的实践吗?还是在 .c文件中声明它,在其他文件中使用 extern更好?

135043 次浏览

您应该在头文件中将其声明为 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 语言中,定义和声明的区别在于定义为变量保留了空间,而声明只是将变量引入符号表中(并导致链接器在链接时间到来时查找它)。

如果你声明

int x;

在一个头文件中,然后包含在多个位置,您最终将得到多个 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,它就不会保存您。