【问题标题】:error: ‘fileno’ was not declared in this scope错误:未在此范围内声明“fileno”
【发布时间】:2015-06-23 21:18:21
【问题描述】:

我在 Windows 8 上运行 Cygwin,试图为我想要修改的游戏编译源代码。不幸的是,我在构建涉及 fileno 函数时遇到了一些错误。在进行了一些谷歌搜索之后,问题似乎与 c++11 支持有关(我不太确定这意味着什么)。人们发现的大多数解决方案都涉及在编译时添加一些选项,例如 -std=c++0x 或 -std=c++11,但是我尝试将选项添加到 makefile 中的尝试都没有成功,我不知道如果那是导致问题的原因。我将包含引发错误的代码 sn-p 和指向 makefile 的链接,因为它非常大。你能给我的任何建议都会很棒。

引发错误的代码:

    time_t file_modtime(FILE *f)
    {
        struct stat filestat;
        if (fstat(fileno(f), &filestat))
            return 0;

        return filestat.st_mtime;
    }

Link to Makefile

它被托管在 github 上

编辑:在得到一些建议后,我浏览了 makefile 并发现了五个使用 -std 选项的实例,使用它们并没有改变任何东西。我的 Cygwin 配置有问题吗?我安装了我正在构建的游戏的安装指南中告知我需要的软件包。

【问题讨论】:

标签: c++ c++11 makefile


【解决方案1】:

将 makefile 中的 -std=c*** 更改为 -std=gnu++0x 应该可以解决您的问题。

如果您不知道c++11 是什么,那么您很可能不会使用它。

另外,如果您需要 c++11 支持,您也可以这样做:-std=gnu++11 而不是 -std=gnu++0x

【讨论】:

    【解决方案2】:

    【讨论】:

    • 不,fileno() “已弃用”。它是a standard POSIX function - and isn't going away any time soon。微软“弃用”各种标准函数even including many like fopen() that are required to be available by the C standard itself。我的愤世嫉俗者说微软创造了所有这些虚假的“弃用”来欺骗人们编写不可移植的代码。
    • Microsoft 的第一个 URL 声明:“不推荐使用此 POSIX 函数。请改用符合 ISO C++ 的 _fileno。”,这就是为什么我在此开头声明“对于 windows...”回答,因为此信息是在 windows 上下文中提供的,不应脱离上下文。我想如果这个答案令人困惑和无益,我们可以编辑或删除它?
    • fileno() 的情况下,Microsoft 不能声明 POSIX 合规性,然后声明 fileno() 已“弃用”,因为 fileno() 尚未被 POSIX 弃用。此外,微软对其他功能的“弃用”违反了他们试图声称支持“弃用”fileno() 的 ISO C++。例如,fopen()C++ standard 的表 134 下被列为必需的 C++ 函数。
    • (cont) 微软的“弃用”更糟糕的是,它们提供了"incomplete and conforms neither to C11 nor to the original TR 24731-1." 的替代功能,微软使用这些“弃用”来推动“......不能被视为符合或可移植的功能” 。”现在你有了更多关于微软“弃用”的完整背景。
    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 2010-10-02
    相关资源
    最近更新 更多