C中共享的全局变量

shared global variables in C

如何创建在C中共享的全局变量?如果我把它放在头文件中,那么链接器会抱怨变量已经被定义。唯一的方法是在我的一个C文件中声明变量,并在所有其他要使用它的C文件的顶部手动放入extern?听起来不太理想。


在一个头文件(shared.h)中:

1
extern int this_is_global;

在每个要使用此全局符号的文件中,包含包含外部声明的头文件:

1
#include"shared.h"

为了避免多个链接器定义,必须在编译单元(例如:shared.cpp)中只存在一个全局符号声明:

1
2
3
/* shared.cpp */
#include"shared.h"
int this_is_global;


在头文件中用extern写入。在其中一个C文件的全局范围内,声明它不带extern


在头文件中

头文件

1
2
3
4
5
6
7
8
#ifndef SHAREFILE_INCLUDED
#define SHAREFILE_INCLUDED
#ifdef  MAIN_FILE
int global;
#else
extern int global;
#endif
#endif

在包含文件的文件中,您希望全局保存:

1
2
#define MAIN_FILE
#include"share.h"

在其他需要外部版本的文件中:

1
#include"share.h"


您将声明放在头文件中,例如

1
 extern int my_global;

在一个.c文件中,您在全局范围内定义它。

1
int my_global;

想要访问my_global的每个.c文件都包括extern所在的头文件。


如果在C和C++之间共享代码,请记住将以下内容添加到EDCOX1×4文件中:

1
2
3
4
5
6
7
8
9
10
#ifdef __cplusplus
extern"C" {
#endif

extern int my_global;
/* other extern declarations ... */

#ifdef __cplusplus
}
#endif

只有一个头文件是一种更干净的方法,因此维护起来更简单。在带有全局变量的头文件中,每个声明前面都有一个关键字(我使用common),然后在一个源文件中像这样包含它

1
2
3
#define common
#include"globals.h"
#undef common

以及其他类似的源文件

1
2
3
#define common extern
#include"globals.h"
#undef common

只需确保不要初始化globals.h文件中的任何变量,否则链接器仍会抱怨,因为即使使用extern关键字,初始化的变量也不会被视为外部变量。global.h文件与此类似

1
2
3
4
#pragma once
common int globala;
common int globalb;
etc.

似乎适用于任何类型的声明。当然,不要在定义上使用通用关键字。