C中共享的全局变量

时间:2010-06-09 23:12:57

标签: c variables linker global-variables scope

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

6 个答案:

答案 0 :(得分:86)

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

extern int this_is_global;

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

#include "shared.h"

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

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

答案 1 :(得分:57)

在头文件中,使用extern编写它。 并且在其中一个c文件的全局范围内声明它没有extern

答案 2 :(得分:22)

在头文件中

头文件

#ifndef SHAREFILE_INCLUDED
#define SHAREFILE_INCLUDED
#ifdef  MAIN_FILE
int global;
#else
extern int global;
#endif
#endif

在包含您希望全局生效的文件的文件中:

#define MAIN_FILE
#include "share.h"

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

#include "share.h"

答案 3 :(得分:15)

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

 extern int my_global;

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

int my_global;

每个想要访问my_global的.c文件都包含带有extern的头文件。

答案 4 :(得分:4)

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

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif

答案 5 :(得分:2)

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

#define common
#include "globals.h"
#undef common

和任何其他类似的源文件

#define common extern
#include "globals.h"
#undef common

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

类似
#pragma once
common int globala;
common int globalb;
etc.

似乎适用于任何类型的声明。当然不要在#define上使用common关键字。