GCC警告与std = c11 arg

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GCC警告与std = c11 arg相关的知识,希望对你有一定的参考价值。

这是一个使用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;
}

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

它只是没有任何错误/警告。

感谢您的反馈。

答案

如果使用Posix功能,则需要定义适当的功能测试宏。请参阅man feature_test_macrosPosix standard

如果没有将_POSIX_C_SOURCE定义为适当的值(取决于所需的最小Posix级别),那么标准库头文件将不会定义来自该版本和后续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;
}

以上是关于GCC警告与std = c11 arg的主要内容,如果未能解决你的问题,请参考以下文章

gcc 的扩展初始化程序列出警告

Android 应用程序不会启动,也不会列出错误/警告。使用片段和问题似乎与 var args = ViewFragmentArgs

std::declval() 在 GCC 中触发带有警告的断言错误

C11新特性之std::function与std::bind

C11 标准特性研究

“警告:比较总是正确的”