c语言_std=c11,关于带有std = c11 arg的c:GCC警告

这是使用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),但确切地说,它可能"更好"。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值