尽管包含<sys / stat.h>标头

问题描述

我正在使用“ 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;

解决方法

您使用的宏不正确。它们是类似于函数的宏,它们接受模式作为参数:

if( S_ISDIR(s.st_mode) )
{
    return false;
}
else if( S_ISREG(s.st_mode) )
{
    return true;
}
else
{
    return false;
}
,

您可能想知道为什么原始代码(带有S_IFREGS_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通常是一个错误。)