C中的共享全局变量


82

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


在您自己的源代码中共享?将extern声明放在一个头文件中,并将定义放在另一个(单个)源文件中。这些当然是在您的进程线程之间共享的。对于进程间的数据共享,请使用IPC机制(共享内存,管道)。
埃尔南



Answers:


63

在头文件中用编写extern。并在c文件之一的全局范围内声明不带extern


1
我们可以在* .c文件的头文件中声明它吗?
Geremia

91

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

extern int this_is_global;

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

#include "shared.h"

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

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

您是否有首选参考资料来了解有关IPC机制的更多信息?
NickO

7
请更加强调“仅是您的全局符号的一个声明……”。我在所有要使用全局变量的c文件中都声明了:(
AntonioCS,2013年

22

在头文件中

头文件

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

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

#define MAIN_FILE
#include "share.h"

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

#include "share.h"

啊,这是我前一段时间的解决方案-我忘记了MAIN_FILE预处理程序变量。我thinik我喜欢CUR接受的答案更寿
克劳迪乌

15

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

 extern int my_global;

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

int my_global;

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


5

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

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif

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关键字。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.