这是使用pthread_kill()调用的一些C源代码:
#include
#include
#include
int main(int argc, char *argv[])
{
pthread_t th = NULL;
pthread_kill(th, 0);
return 0;
}
Gcc编译会根据-std参数值生成各种结果(请参见下文)。 我不了解这些不同的行为。
除了pthread_kill()符合POSIX.1-2008之外,我没有在手册页中获得有趣的信息。
环境:Linux 3.2 64位。 GCC 4.7.2。
使用-std = c11
gcc main.c -std=c11 -pthread
我得到一个隐式声明:
main.c:9:2: warning: implicit declaration of function ‘pthread_kill’ [-Wimplicit-function-declaration]
使用-std = c99
gcc main.c -std=c99 -pthread
与-std = c11相同的结果:
main.c:9:2: warning: implicit declaration of function ‘pthread_kill’ [-Wimplicit-function-declaration]
使用-std = c90
gcc main.c -std=c90 -pthread
它完全可以正常工作,没有任何错误/警告。
感谢您的反馈。
您是说-lpthread而不是-pthread吗?
@SouravGhosh它们完全一样。好吧,实际上-pthread应该是首选。
要注意的另一件事是-std=gnu99或例如-std=gnu11标志使您可以扩展到相应的C标准,包括在linux上使用glibc时的库功能,例如posix函数。
@nos实际上我对GNU扩展不感兴趣,我更喜欢使用严格的ISO规范进行编译(示例中删除了-pedantic * args)。
@Flow当然,您在这里得到警告的原因是因为pthread函数不是ISO C的一部分
@nos:GNU!= POSIX。核心语言的扩展与库的扩展有所不同。
@mafso好的。但是,不管名称是gnu,如果在Linux上使用glibc,则事实是-std = gnu99启用posix接口。您对核心语言的不同是完全正确的。
@nos:我的意思是,POSIX与ISO C不矛盾(它是严格的超集),因此将ISO C与POSIX库一起使用是完全可以的。在编写可移植代码(可移植到非GNU系统,具有POSIX支持)时,您不想使用-std=gnu99,而是定义功能测试宏。 (可能我有点反应过度,但是最近在"如果您想使用POSIX扩展,您需要-std=gnu99"上有一些答案,这是错误的;核心语言扩展和库扩展(对于后者, GNU,POSIX,BSD扩展)是独立的东西。)
如果使用Posix功能,则需要定义适当的功能测试宏。 请参见man feature_test_macros或Posix标准。
如果未将_POSIX_C_SOURCE定义为适当的值(取决于所需的最低Posix级别),则标准库头文件将不定义该接口和后续Posix标准的接口。
例如,如果您需要Posix.1-2008,则需要执行以下操作:
#define _POSIX_C_SOURCE 200809L
#include
#include
#include
int main(int argc, char *argv[])
{
pthread_t th = NULL;
pthread_kill(th, 0);
return 0;
}
谢谢,这就是解决方案。 但是,我应该如何知道此功能是Posix功能? pthread_create()也是Posix(1.2001),但我从未指定过。 根据您的文档,我在pthread_kill()手册页中没有看到" feature_test_macros"字样。
@Flow-我认为关键是,pthread不是ISO C的一部分。"我应该如何知道此功能是Posix功能?" -Pthreads是POSIX线程的缩写。 包含标头并没有公开该功能,但在某些情况下pthreads仍会影响编译器选项/链接,这有点奇怪。
@Flow:大多数联机帮助页都有关于功能测试宏的部分; 如果pthread_create在您的系统中缺少一个,我会说这是一个文档错误。 但是,可以使用链接中包含答案的posix标准中的图表从CONFORMING TO线中得出值。 我一直都在使用200809L(我在Makefile的C标志中放入了-D_POSIX_C_SOURCE=200809L),但确切地说,它可能"更好"。