Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当头文件在C中可用时才包括头文件?_C_Macros_Include_C Preprocessor_Header Files - Fatal编程技术网

仅当头文件在C中可用时才包括头文件?

仅当头文件在C中可用时才包括头文件?,c,macros,include,c-preprocessor,header-files,C,Macros,Include,C Preprocessor,Header Files,我想将pthread的逻辑添加到我正在为C编写的一个小型评测库中。但是,我只想在pthread可用的情况下执行与pthread相关的逻辑 是否有一种使用预处理器指令的编程方法 我想它看起来会像: #ifdef pthread#h #包括 #恩迪夫 . . . #ifdef pthread_h //这里的pthread特定逻辑 #恩迪夫 但我不确定,也不知道该怎么办 #ifdef pthread#h 如果我还没有包括pthread.h,pthread\u h不可用。对吧? 是否有方法仅在头文件

我想将pthread的逻辑添加到我正在为C编写的一个小型评测库中。但是,我只想在pthread可用的情况下执行与pthread相关的逻辑

是否有一种使用预处理器指令的编程方法

我想它看起来会像:

#ifdef pthread#h
#包括
#恩迪夫
. . .
#ifdef pthread_h
//这里的pthread特定逻辑
#恩迪夫
但我不确定,也不知道该怎么办

#ifdef pthread#h
如果我还没有包括
pthread.h
pthread\u h
不可用。对吧?

是否有方法仅在头文件可用时才包含头文件?也许我可以通过这种方式达到我所期待的结果


我期望的结果是在分析数据中包含有关当前线程ID的信息,但前提是库中有pthread可用于调用
pthread\u self()

“是否有一种方法仅在头文件可用时才包含头文件?也许我可以通过这种方法实现我所期望的结果。”

对。如果编译器支持宏,则可以使用宏:

#if defined __has_include
#  if __has_include (<pthread.h>)
#    include <pthread.h>
#  endif
#endif

...

#if defined __has_include
#  if __has_include (<pthread.h>)
#    // pthread specific logic here
#  endif
#endif
#如果定义了"包含"
#如果有包含()
#包括
#恩迪夫
#恩迪夫
...
#如果已定义,则包含
#如果有包含()
#//此处为pthread特定逻辑
#恩迪夫
#恩迪夫

旁注:

  • “…如果pthread实际上在编译时已链接。”


链接过程不是在编译时完成的。它是在汇编之后出现的。C预处理器甚至在编译之前就开始工作了。

我找到了这个我最喜欢的解决方案。它似乎是最轻便、最直截了当的

如果用户希望使用pthread进行编译,只需指示用户在编译时使用
-D PROF_with_PTHREA=1
,然后在使用pthread之前在C源代码中检查该预处理器指令

$gcc-I./-o test text.c-lpthread-D PROF_,PTHREAD=1
#带线程的ifdef PROF_
#包括
#恩迪夫
. . .
#带线程的ifdef PROF_
//这里的pthread特定逻辑
#恩迪夫


虽然这不检查库是否可用或标题是否可用,但它实现了我想要的结果,并以非常直接和简单的方式进行操作。

Linked
!=<代码>包括在内。这是不一样的。编译时没有链接。在编译之后的链接过程中,
链接库
,通常由名为
linker
的单独程序完成,除了链接过程中的错误措辞。为什么提供的示例对您不起作用?为什么以及因为什么您特别不确定?提供的示例对我不起作用,因为我不知道如果在我包含
pthread.h
之前不能定义它,会在哪里定义
pthread\u h
。我是否可以尝试包含一个文件,但如果找不到该文件,则会失败?也许我可以根据可用的标题而不是可用的库来做这件事。@P_uj_uu我已经修改了这个问题,希望这个术语现在更有意义。我对C不太熟悉,所以我来这里。内森,读到你应该引述引语的来源。通过这种方式,您可以帮助其他人找到您找到的解决方案的源代码。只是出于兴趣:
\u是否包含了我的答案中所示的
宏?它在GCC中得到了支持,并实现了您想要的功能—直接使用预处理器宏检查库是否可用,而无需任何其他编译器选项,如
-D PROF_with_PTHREAD=1
(当然
-PTHREAD
除外)。这种方法的确切优点是什么?我在回答中看不到这一点“这似乎是最方便、最直截了当的。”给人的印象是一种观点。@roberts-supportsmonicacellio它实际上不是一句引语。这只是一个糟糕的格式选择。我会解决的。我认为允许使用预处理指令的编译时定义比要求用户使用GCC更具可移植性。