头文件中的变量声明

时间:2009-07-22 09:43:24

标签: c header

如果我有一个可以在多个来源中使用的变量 - 在标题中声明它是一个好习惯吗?或者最好在.c文件中声明它并在其他文件中使用extern

5 个答案:

答案 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 */

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