我有以下头文件和源文件。
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
。
我的问题是,当我在某些头文件中将全局变量定义为 extern
时,我收到错误消息,指出它们未定义或已定义多次。另外,一些全局变量要在线程之间共享,而另一些则要由每个线程独立使用。
我知道这些错误是由于头文件嵌套(包含)在源文件中的方式造成的。
所以:
包含这些头文件并定义
extern
变量的正确方法是什么?线程间共享的变量和不应在线程间共享的变量有何区别?
最佳答案
请遵守以下规则:
- 不要在 header 中定义变量,仅声明它们。 IE。始终将
extern
与变量一起使用。 - 在一个代码文件中精确定义每个变量(通过 1 声明
extern
)一次,即不使用extern
。 - 即使声明变量也只能在一个 header 中完成一次。 (虽然如果你一致地执行,编译器不会提示,但只执行一次仍然更干净、更安全。)
- 函数原型(prototype)进入标题一次;即以
;
结尾。 - 函数定义一次进入代码文件;即带有函数头(没有
;
的原型(prototype)),后跟函数体({...}
)。 - 无论您想要访问或引用什么内容,请将声明它的 header 包含到文件中(您需要它的 header 或代码文件)。
- 使用重新包含防护来提高安全性(主要用于宏等)。
重新包含防护示例:
MyHeader.h:
#ifndef MYHEADER_H
#define MYHEADER_H
/* only declarations */
#endif /* MYHEADER_H */
关于c - 在c中的多线程中包含嵌套头文件的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46439321/