这是我的计划.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
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;
}
Run Code Online (Sandbox Code Playgroud)
当我用-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
Run Code Online (Sandbox Code Playgroud)
但是当我用-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:
Run Code Online (Sandbox Code Playgroud)
我使用-std=c90或时出了什么问题-std=c99?
在此-std=c89请求实现仅提供ISO 9899:1989标识符部分的声明.标识符strerror_r不是C89(或C99)的一部分,因此没有原型.因此,您会收到有关隐式声明的警告.
如果你查看相关的标题,你可能会发现埋在迷宫中#ifdef的strerror_r原型.该-std选项更改了影响原型可见性的预定义宏集.