我从这里开始阅读 strtoul()/strtoull() 的文档,在“符合条件”部分的底部,它说明了这两点:
strtoul():POSIX.1-2001、POSIX.1-2008、C89、C99 SVr4。
strtoull():POSIX.1-2001、POSIX.1-2008、C99。
除了整个文档中的其他参考资料外,这两行向我表明,在使用 c89/c90 标准编译程序时,函数 strtoull 不应该可用。但是,当我使用 gcc 运行快速测试时,它允许我调用此函数,而不管我指定的标准是什么。
首先,我用来测试的代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
unsigned long long x;
const char *str = "1234";
x = strtoull(str, NULL, 10);
printf("%llu\n", x);
return 0;
}
这是我的编译命令:
gcc test.c -std=c89 -pedantic -Wall -Wextra
现在,公平地说,它确实警告我兼容性问题:
test.c: In function ‘main’:
test.c:6:16: warning: ISO C90 does not support ‘long long’ [-Wlong-long]
unsigned long long x;
^~~~
test.c:9:6: warning: implicit declaration of function ‘strtoull’; did you mean ‘strtoul’? [-Wimplicit-function-declaration]
x = strtoull(str, NULL, 10);
^~~~~~~~
strtoul
test.c:11:9: warning: ISO C90 does not support the ‘ll’ gnu_printf length modifier [-Wformat=]
printf("%llu\n", x);
^~~~~~~~
鉴于文档,这些警告消息正是我所期望的。它通知我找不到我指定的功能,甚至 C90 标准不支持unsigned long long
. 但是,当我尝试运行此代码时,它运行良好,没有崩溃或其他类型的错误。它根据需要打印 value 1234
。所以,基于这个实验,我有几个问题我希望有人比我更有经验。
- 这是我没有提供必要的编译标志来执行“严格”c98 标准的问题吗?
- 这是我误解文档的情况,还是我应该参考 gcc 本身的一些文档?如果是这样,我在哪里可以找到它?
- 我不理解的编译/链接过程是否有一些基本的东西,这解释了这个问题?
- 为什么我会被警告不兼容,甚至警告我正在调用的函数不存在,但代码仍然可以正常工作?
- 这个实验是否意味着这些
-std=c89 -pedantic
标志实际上并没有强制执行 C89/C90 标准?
最后一点,我并不是想说我想在 C89 中使用这个功能,我只是对兼容性限制感到好奇,然后对答案感到困惑。
提前感谢您的任何回复!