我正在使用“ S_ISDIR”和“ S_ISREG”,但收到未声明的错误。我尝试在macOS(使用S_IFDIR和S_IFREG)中使用它,但它在Linux终端中不起作用。
error: ‘S_ISDIR’ undeclared (first use in this function)
error: ‘S_ISREG’ undeclared (first use in this function); did you mean ‘S_ISDIR’?
struct stat s;
if(stat(fileName, &s) == 0 )
{
if( s.st_mode & S_ISDIR )
{
return false;
}
else if( s.st_mode & S_ISREG )
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
return false;
答案 0 :(得分:3)
您使用的宏不正确。它们是类似于函数的宏,它们接受模式作为参数:
if( S_ISDIR(s.st_mode) )
{
return false;
}
else if( S_ISREG(s.st_mode) )
{
return true;
}
else
{
return false;
}
答案 1 :(得分:0)
您可能想知道为什么原始代码(带有S_IFREG
和S_IFDIR
)可以在一个操作系统上运行而不能在另一个操作系统上运行。这是因为S_IFxxx
常数在POSIX标准的某些修订版中是可选的(这是指定sys/stat.h
内容的标准)。
类似S_ISxxx
的函数必须可用,因此最好使用它们,但是有时使用S_IFxxx
常量可以使人的代码更清晰。它们是宏,因此您可以使用#ifdef S_IFREG
来测试它们的存在(如果S_IFREG
可用,则可以假设其他变量也是如此)。
某些操作系统默认情况下不提供S_IFxxx
常量,但是如果您将#define _XOPEN_SOURCE 700
放在所有#include
行的上方则可以。 Linux通常不是其中的一种操作系统,但是如果在编译器命令行上使用-ansi
或-std=cNN
,Linux就会成为其中一种操作系统。 (出于种种原因,NB太复杂了,使用这些开关而不是-std=gnuNN
通常是一个错误。)