这是我的计划.
#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=gnu90
or 编译它时-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=c90
or 编译它时-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
?
在此-std=c89
请求实现仅提供ISO 9899:1989标识符部分的声明.标识符strerror_r
不是C89(或C99)的一部分,因此没有原型.因此,您会收到有关隐式声明的警告.
如果你查看相关的标题,你可能会发现埋在迷宫中#ifdef
的strerror_r原型.该-std
选项更改了影响原型可见性的预定义宏集.