如果我将标准设置为 c99 或 c11,为什么我的编译器认为我的 readlink() 是隐式声明的?
Why does my compiler think my readlink() is implicitly declared if I set the standard to c99 or c11?
我有这样的玩具代码
#include <stdlib.h>
#include <unistd.h>
int main()
{
readlink("/proc/self/exe", "/my/path", 128);
return EXIT_SUCCESS;
}
当我用
编译时
icc main.c -o helloworld
一切都很好,但是当我例如尝试
icc -std=c99 main.c -o helloworld
或
icc -std=c11 main.c -o helloworld
我收到错误消息
main.c(6): warning #266: function "readlink" declared implicitly
导致此错误的 c11(或 c99)标准是什么?
定义包裹在
#if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K
根据 readlink
的手册页,您需要先设置正确的源定义。
当前 POSIX 定义可以用 gcc -std=c11 -D_POSIX_C_SOURCE=200809L
设置
如果您没有正确设置所有内容,您会发现未定义的行为,因为 sizeof(int)
和 sizeof(void*)
不再相同。隐式声明确实需要变成 64 位。
-std=gnu11
开启一切。如果您不必关心是否不小心使用了 gcc 扩展,只需将其设置在您的 makefile 中即可。
我有这样的玩具代码
#include <stdlib.h>
#include <unistd.h>
int main()
{
readlink("/proc/self/exe", "/my/path", 128);
return EXIT_SUCCESS;
}
当我用
编译时icc main.c -o helloworld
一切都很好,但是当我例如尝试
icc -std=c99 main.c -o helloworld
或
icc -std=c11 main.c -o helloworld
我收到错误消息
main.c(6): warning #266: function "readlink" declared implicitly
导致此错误的 c11(或 c99)标准是什么?
定义包裹在
#if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K
根据 readlink
的手册页,您需要先设置正确的源定义。
当前 POSIX 定义可以用 gcc -std=c11 -D_POSIX_C_SOURCE=200809L
设置
如果您没有正确设置所有内容,您会发现未定义的行为,因为 sizeof(int)
和 sizeof(void*)
不再相同。隐式声明确实需要变成 64 位。
-std=gnu11
开启一切。如果您不必关心是否不小心使用了 gcc 扩展,只需将其设置在您的 makefile 中即可。