为什么我们在使用线程编译C代码时编写-D_REENTRANT

时间:2013-12-19 04:17:33

标签: gcc

当我们编译一个在其中实现线程的C程序时,我们编写此语句。 我不明白为什么我们在这里使用-D_REENTRANT。 例如gcc t1.c -lpthread -D_REENTRANT

3 个答案:

答案 0 :(得分:10)

实际上,在GCC中使用线程编译的推荐方法是使用-pthread选项。它相当于-lpthread -D_REENTRANT所以你实际上没有问题。

标志执行以下操作:

  • -lpthread指示链接器使用适当的库版本来实现线程兼容性。

  • -D_REENTRANT告诉编译器使用线程使用所需的声明(函数,类型......)。

答案 1 :(得分:5)

你不必写它。但建议这样做。

Defining _REENTRANT使编译器在C库中使用多个函数的线程安全(即可重入)版本。

答案 2 :(得分:3)

gcc等编制者使用-D namename预定义为定义为1的宏。

在程序源代码和头文件中,您将看到检查_REENTRANT的编译器指令,并在此宏为true1时执行某些操作。

如果此宏未传递给编译器,则编译器指令_REENTRANT将为false0

从/usr/include/features.h获取此示例。

#if defined _REENTRANT || defined _THREAD_SAFE
# define __USE_REENTRANT    1
#endif

如果定义了_REENTRANT,您将看到它告诉编译器该怎么做。

最后,您必须再次链接代码pthread库,以便pthread_*() pthread_create()pthread_join()使用-lpthread系列。

libpthread.so传递给链接器时,代码会与{{1}}链接。