我有以下标头和源文件。
clnt_thread.h included in clnt_thread.cpp and main.c
jacc_sim.h included in jacc_sim.cpp and main.c
srvr_info.h included in srvr_info.cpp and main.c
constants.h included in clnt_thread.h and in srvr_info.h, both see above
and in global_variables.c
global_variables.h included in main.c
main.c
一些变量在clnt_thread.h
中被声明为extern
,而jacc_sim.h
中的其他变量。
我的问题是,当我将全局变量定义为某些标题文件中的extern
时,我会遇到错误,说它们要么是未定义的,要么是多次定义的。另外,某些全局变量将在线程之间共享,而每个线程将独立使用。
我知道这些错误是源文件中标头文件嵌套(包括)的结果。
so:
包含这些标头文件并定义
extern
变量的正确方法是什么?是什么区分线程之间共享的变量,另一个不应在线程之间共享的变量?
确实遵循以下规则:
- 请勿在标题中定义变量,而只能声明它们。IE。始终将
extern
与变量一起使用。 - 在一个代码文件中恰好在一个代码文件中定义每个变量(声明
extern
by 1),即没有extern
。 - 甚至在一个标题中只能宣布变量一次。(尽管如果您始终执行编译器,则不会抱怨,但只能进行一次更干净,更安全。)
- 功能原型进入标题一次;即用
;
末端。 - 函数定义一次进入代码文件,一次;即具有功能头(无
;
的原型),然后是功能主体({...}
)。 - 无论您想访问或参考,都包括将其声明为文件中的标题(您需要它需要的标题或代码文件)。
- 使用额外的后卫以进行额外的安全(主要用于宏等)。
重新包含后卫的示例:
myheader.h:
#ifndef MYHEADER_H
#define MYHEADER_H
/* only declarations */
#endif /* MYHEADER_H */