如果我将标准设置为 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 中即可。