【问题标题】:What is the correct way to include nested header files in multithreading in c在c中的多线程中包含嵌套头文件的正确方法是什么
【发布时间】:2017-09-27 04:06:07
【问题描述】:

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

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

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

所以:

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

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

【问题讨论】:

  • 您还没有展示您认为它们是如何在标题中声明/定义的。我们应该如何猜测你在做什么?您是否在标题中使用了关键字extern?如果不是,那是您问题的主要部分。请注意,标头是编译时问题;多线程是一个运行时问题。它们本质上是无关的。
  • 因为“他们……不相关。”
  • 如果您遇到多个定义错误,这可能意味着您忘记使用extern,并且您可能没有保护您的头文件不被多次包含。
  • 您似乎面临的问题与程序是多线程还是单线程无关。
  • @alk:OP 可能对如何声明或定义线程特定变量感到困惑,但帖子中没有提到这一点。

标签: c multithreading include global-variables


【解决方案1】:

请遵守以下规则:

  1. 不要在头文件中定义变量,只声明它们。 IE。始终将 extern 与变量一起使用。
  2. 在一个代码文件中定义每个变量(用 1 声明 extern)仅一次,即不使用 extern
  3. 即使声明变量也只能在一个标头中执行一次。 (尽管如果您始终如一地执行此操作,编译器不会抱怨,但只执行一次仍然更清洁、更安全。)
  4. 函数原型进入标题,一次;即以; 结尾。
  5. 函数定义进入代码文件,一次;即带有函数头(没有; 的原型),后跟函数体({...})。
  6. 无论您想访问或引用什么,都将声明它的标头包含在文件中(您需要它的标头或代码文件)。
  7. 使用重新包含防护以提高安全性(主要用于宏等)。

重新包含保护的示例:

MyHeader.h:

#ifndef MYHEADER_H
#define MYHEADER_H

/* only declarations */

#endif /* MYHEADER_H */

【讨论】:

  • 这当然只能回答“1.”。然而,我相信(同意alk)只有“1”。与解决 OPs 问题有关。
猜你喜欢
  • 2010-11-15
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 2014-05-23
  • 2021-08-29
  • 1970-01-01
  • 2021-03-21
  • 2019-07-28
相关资源
最近更新 更多