只有在C语言中可用时才包含头文件?

问题描述 投票:1回答:1

我想把pthread的逻辑添加到我为C语言编写的一个小的profiling库中,但是,我只想在pthread可用的情况下执行与pthread相关的逻辑。

有没有一种程序化的方法可以使用预处理程序指令来实现这个功能?

我想应该是这样的。

#ifdef pthread_h
#include <pthread.h>
#endif

. . .


#ifdef pthread_h
// pthread specific logic here
#endif

但我不确定的部分,不知道该怎么做的是

#ifdef pthread_h

如果我没有包括 pthread.h 还没有。pthread_h 是不可用的。是吗?

有没有办法只有在头文件可用的情况下才包含它?也许我可以通过这种方式达到我想要的结果。


我想要的结果是在剖析数据中包含关于当前线程ID的信息,但只有当库中有pthread可用时,才能调用 pthread_self().

c macros c-preprocessor header-files
1个回答
1
投票

"有没有一种方法可以只在有头文件的情况下才包含头文件?也许我可以通过这种方式达到我想要的结果。"

是的,你可以用即墨的。__has_include 宏,如果你的编译器支持的话。

#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在编译时已经被链接了"

链接过程不是在编译时完成的。它是在编译之后进行的。而C语言的预处理器甚至在编译之前就已经完成了它的工作。


0
投票

我登陆了这个我最喜欢的解决方案。它似乎是最可移植的,也是最直接的。

只需指示用户用 -D PROF_WITH_PTHREA=1 当编译时,如果他们希望使用pthread,然后在C源代码中检查预处理器指令,然后再使用pthread做任何事情。

$ gcc -I./ -o test text.c -lpthread -D PROF_WITH_PTHREAD=1
#ifdef PROF_WITH_PTHREAD
#include <pthread.h>
#endif

. . .

#ifdef PROF_WITH_PTHREAD
// pthread specific logic here
#endif

虽然这并没有检查是否有可用的库,也没有检查是否有可用的头,但它达到了我想要的结果,而且是以一种非常直接和简单的方式实现的。

© www.soinside.com 2019 - 2024. All rights reserved.