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

时间:2017-09-27 04:06:07

标签: 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

某些变量在extern中声明为clnt_thread.h,在jacc_sim.h中声明为其他变量。

我的问题是,当我在一些头文件中将全局变量定义为extern时,我得到的错误是它们未定义或者它们被多次定义。另外,一些全局变量将在线程之间共享,而一些全局变量将由每个线程独立使用。

我知道这些错误是源文件嵌套(包含)头文件的方式的结果。

所以:

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

  2. 区分线程之间共享的变量和不应该在线程之间共享的另一个变量?

1 个答案:

答案 0 :(得分:1)

请遵守以下规则:

  1. 不要在标题中定义变量,只声明它们。即始终使用extern变量。
  2. 在一个代码文件中定义每个变量(在{)声明extern一次,即没有extern
  3. 甚至声明变量应该只在一个标题中完成一次。 (虽然如果你一直这样做,编译器不会抱怨,但只做一次它仍然更干净,更安全。)
  4. 函数原型进入标题,一次;即最后;
  5. 函数定义一次进入代码文件;即使用函数头(没有;的原型),然后是函数体({...})。
  6. 无论您想要访问或引用什么,请包含将其声明到文件中的标题(您需要的标题或代码文件)。
  7. 使用重新加入防护装置以获得额外的安全性(主要用于宏等)。
  8. 重新加入警卫的例子:

    MyHeader.h:

    #ifndef MYHEADER_H
    #define MYHEADER_H
    
    /* declararions and definitions */
    
    #endif /* MYHEADER_H */