首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >S_ISDIR和S_ISREG未声明,尽管包含了<sys/stat.h>头

S_ISDIR和S_ISREG未声明,尽管包含了<sys/stat.h>头
EN

Stack Overflow用户
提问于 2020-09-26 02:25:25
回答 2查看 1.1K关注 0票数 0

我使用的是"S_ISDIR“和"S_ISREG”,但得到的错误是它们是未声明的。我试着在macOS中使用它(使用S_IFDIR和S_IFREG),它可以工作,但在linux终端上不起作用。

代码语言:javascript
运行
复制
error: ‘S_ISDIR’ undeclared (first use in this function)  
error: ‘S_ISREG’ undeclared (first use in this function); did you mean ‘S_ISDIR’?  
代码语言:javascript
运行
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-26 03:28:43

你用错了宏。它们是类似于函数的宏,它们接受模式作为参数:

代码语言:javascript
运行
复制
if( S_ISDIR(s.st_mode) )
{
    return false;
}
else if( S_ISREG(s.st_mode) )
{
    return true;
}
else
{
    return false;
}
票数 4
EN

Stack Overflow用户

发布于 2020-09-26 21:38:51

您可能想知道,您的原始代码(使用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,它就会成为这些操作系统之一。(注:由于原因太复杂,无法进入这里,使用这些开关而不是-std=gnuNN通常是错误的。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64073291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档