当前位置:  开发笔记 > 运维 > 正文

为什么使用gnu90和c90标准编译时strerror_r的行为会有所不同?

如何解决《为什么使用gnu90和c90标准编译时strerror_r的行为会有所不同?》经验,为你挑选了1个好方法。

这是我的计划.

#include 
#include 
#include 
#include 

int main()
{
        char errbuf[256];

        errno = 0;
        strtoul("99999999999999999999999999999999999999999999", NULL, 0);
        strerror_r(errno, errbuf, sizeof errbuf);
        printf("strerror_r: %s\n", errbuf);

    return 0;
}

当我用-std=gnu90or 编译它时-std=gnu99,我得到了预期的输出.

susam@nifty:~/lab/linux$ rm -f a.out && gcc -std=gnu90 -Wall -Wextra -pedantic foo.c && ./a.out 
strerror_r: Numerical result out of range
susam@nifty:~/lab/linux$ rm -f a.out && gcc -std=gnu99 -Wall -Wextra -pedantic foo.c && ./a.out 
strerror_r: Numerical result out of range

但是当我用-std=c90or 编译它时-std=c99,我得到一个警告,我没有看到strerror_r把字符串放进去errbuf.

lone@debian:~/lab/linux$ rm -f a.out && gcc -std=c90 -Wall -Wextra -pedantic foo.c && ./a.out
foo.c: In function ‘main’:
foo.c:12:2: warning: implicit declaration of function ‘strerror_r’ [-Wimplicit-function-declaration]
  strerror_r(errno, errbuf, sizeof errbuf);
  ^
strerror_r:
lone@debian:~/lab/linux$ rm -f a.out && gcc -std=c99 -Wall -Wextra -pedantic foo.c && ./a.out
foo.c: In function ‘main’:
foo.c:12:2: warning: implicit declaration of function ‘strerror_r’ [-Wimplicit-function-declaration]
  strerror_r(errno, errbuf, sizeof errbuf);
  ^
strerror_r:

我使用-std=c90或时出了什么问题-std=c99



1> Jens..:

在此-std=c89请求实现仅提供ISO 9899:1989标识符部分的声明.标识符strerror_r不是C89(或C99)的一部分,因此没有原型.因此,您会收到有关隐式声明的警告.

如果你查看相关的标题,你可能会发现埋在迷宫中#ifdef的strerror_r原型.该-std选项更改了影响原型可见性的预定义宏集.


如果我正确地解释了宏迷宫,则gnu90 / 99会导致使用XPG版本,即*用一个描述ERRNUM.errno代码的含义的字符串填充BUF。您可以通过运行`gcc -E -std = gnu90 -xc -dM string.h`来查询有效的宏。
推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有