我想把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()
.
"有没有一种方法可以只在有头文件的情况下才包含头文件?也许我可以通过这种方式达到我想要的结果。"
是的,你可以用即墨的。__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语言的预处理器甚至在编译之前就已经完成了它的工作。
我登陆了这个我最喜欢的解决方案。它似乎是最可移植的,也是最直接的。
只需指示用户用 -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
虽然这并没有检查是否有可用的库,也没有检查是否有可用的头,但它达到了我想要的结果,而且是以一种非常直接和简单的方式实现的。