c - 在c中的多线程中包含嵌套头文件的正确方法是什么

标签 c multithreading include global-variables

我有以下头文件和源文件。

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 时,我收到错误消息,指出它们未定义或已定义多次。另外,一些全局变量要在线程之间共享,而另一些则要由每个线程独立使用。

我知道这些错误是由于头文件嵌套(包含)在源文件中的方式造成的。

所以:

  1. 包含这些头文件并定义 extern 变量的正确方法是什么?

  2. 线程间共享的变量和不应在线程间共享的变量有何区别?

最佳答案

请遵守以下规则:

  1. 不要在 header 中定义变量,仅声明它们。 IE。始终将 extern 与变量一起使用。
  2. 在一个代码文件中精确定义每个变量(通过 1 声明 extern)一次,即不使用 extern
  3. 即使声明变量也只能在一个 header 中完成一次。 (虽然如果你一致地执行,编译器不会提示,但只执行一次仍然更干净、更安全。)
  4. 函数原型(prototype)进入标题一次;即以 ; 结尾。
  5. 函数定义一次进入代码文件;即带有函数头(没有 ; 的原型(prototype)),后跟函数体({...})。
  6. 无论您想要访问或引用什么内容,请将声明它的 header 包含到文件中(您需要它的 header 或代码文件)。
  7. 使用重新包含防护来提高安全性(主要用于宏等)。

重新包含防护示例:

MyHeader.h:

#ifndef MYHEADER_H
#define MYHEADER_H

/* only declarations */

#endif /* MYHEADER_H */

关于c - 在c中的多线程中包含嵌套头文件的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46439321/

相关文章:

css - Sass mixin 和 include 不工作

C# Entity Framework 4.1 Lambda Include - 仅选择特定的包含值

c - 使用 makefile 编译时,如何在不使用命令 'make clean' 的情况下清理目标文件?

python - 无法使用 OpenCv unactorPoints 方法取消扭曲点

c - 如何在 Linux 内核中找到一个打开的 inode 的所有者进程?

c++ - QtScript 和线程

c - C 和 gcc 中原子变量的相等性测试

c++ - #includes 的顺序以避免链接错误

c - 如何创建 C 头文件

java - 使用 appcontext 从后台线程显示 AlertDialog