GCC编译警告:使用std=c11参数

5

这是一段使用 pthread_kill() 调用的 C 代码示例:

#include <stdlib.h>
#include <pthread.h>
#include <signal.h>

int main(int argc, char *argv[])
{
        pthread_t th = NULL;

        pthread_kill(th, 0);

        return 0;
}

使用不同的-std参数值,gcc编译会产生不同的结果(见下文)。我不理解这些不同的行为。除了pthread_kill()是符合POSIX.1-2008标准的,我在man手册中没有找到有趣的信息。

环境: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]

With -std=c99

gcc main.c -std=c99 -pthread

与-std=c11相同的结果:
main.c:9:2: warning: implicit declaration of function ‘pthread_kill’ [-Wimplicit-function-declaration]

With -std=c90

gcc main.c -std=c90 -pthread

它能够在没有任何错误/警告的情况下简单地运行。

感谢您的反馈。


1
你是不是想说 -lpthread 而不是 -pthread - Sourav Ghosh
2
@SouravGhosh 它们完全相同。嗯,实际上,-pthread 应该被优先选择。 - user3920237
3
需要注意的另一件事是 -std=gnu99 或例如 -std=gnu11 标志,它们为您提供了对相应 C 标准的扩展,其中包括库特性,如在 Linux 上使用 glibc 时的 posix 函数。 - nos
@nos 其实我对GNU扩展不感兴趣,我更喜欢使用严格的ISO规范进行编译(为了示例,我删除了-pedantic*参数)。 - Flow
1
@mafso 当然可以。但无论名称是否为“gnu”,事实是,如果您在Linux上使用glibc,则-std = gnu99会启用posix接口。您绝对正确,核心语言确实不同。 - nos
显示剩余3条评论
1个回答

9
如果您使用Posix功能,您需要定义一个适当的特性测试宏。请参见man feature_test_macrosPosix标准
如果您不将_POSIX_C_SOURCE定义为适当的值(取决于您需要的最低Posix级别),那么从该标准库头文件开始的接口将不会被定义。
例如,如果您需要Posix.1-2008,则需要执行以下操作:
#define _POSIX_C_SOURCE 200809L
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>

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
@Flow - 我认为重点是,pthread不是ISO C的一部分。 “我怎么知道这个函数是Posix功能?” - Pthreads是“POSIX线程”的缩写。 包含头文件不公开功能有点奇怪,但在某些情况下,pthreads仍会影响编译器选项/链接。 - Brett Hale
1
@Flow:大多数man页面都有关于特性测试宏的部分;如果pthread_create在您的系统中缺少其中一个,我会说那是文档错误。然而,您可以从“符合”行中推导出该值,使用posix标准中链接在答案中的图表。我一直使用200809L(将-D_POSIX_C_SOURCE=200809L放在我的Makefile中的C标志上),但可能更加“精确”为好。 - rici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接