S_IFMT和S_IFREG未定义,-std = c11或-std = gnu11

Gio*_*ano 5 c gcc posix stat c11

这是我第一次使用posix; 包括我:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
Run Code Online (Sandbox Code Playgroud)

我有这个片段.

stat(pathname, &sb);
if ((sb.st_mode & S_IFMT) == S_IFREG) {
    /* Handle regular file */
}
Run Code Online (Sandbox Code Playgroud)

但如果我使用-std = c99或-std = c11或-std = gnu99或-std = gnu11编译,则在Gentoo上使用GCC 4.8.3我收到此错误:

error: ‘S_ISFMT’ undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)

如果我省略-std =*我没有错误.但我也想要-std = c99的所有功能(如关键字restrict或for(int i ;;)等...)我怎样才能编译我的代码?

Dan*_*ein 5

符合POSIX标准的现代系统需要提供S_IFMTS_IFREG价值.唯一不需要此版本(实际上禁止它)的POSIX版本是POSIX.1-1990,它似乎是您机器上的标准.

在任何情况下,每个符合POSIX标准的系统都提供允许您检查文件类型的.这些宏等同于掩蔽方法.

所以在你的情况下,而不是(sb.st_mode & S_IFMT) == S_IFREG,只写S_ISREG(sb.st_mode).