关于C#:头文件中的变量声明

Variable declaration in a header file

本问题已经有最佳答案,请猛点这里访问。

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


您应该在头文件中声明变量:

1
extern int x;

然后在一个C文件中定义它:

1
int x;

在C语言中,定义和声明之间的区别在于定义为变量保留了空间,而声明只是将变量引入符号表中(当涉及到链接时间时,将导致链接器查找变量)。


您可以(应该)在头文件中声明为extern,并在1.c文件中定义它。

请注意,.c文件也应该使用头文件,并且标准模式如下所示:

1
2
3
4
5
6
// file.h
extern int x;  // declaration

// file.c
#include"file.h"
int x = 1;    // definition and re-declaration


如果你像这样宣布

1
int x;

在一个包含在多个地方的头文件中,您将得到X的多个实例(以及可能的编译或链接问题)。

正确的方法是让头文件

1
extern int x; /* declared in foo.c */

然后在foo.c你可以说

1
int x; /* exported in foo.h */

然后您可以在任意多个地方包含您的头文件。


关键是保持头文件和源文件中变量的声明相同。

我用这个技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
------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的类型时,每个人都会改变。您不需要记住在源文件和头文件中更改它。


这个解决方案怎么样?

1
2
3
4
5
6
7
8
9
10
11
12
#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不会保存您。