gpt4 book ai didi

c++ - nuwen.net MinGW Distro 中没有 `fileno()` 功能?

转载 作者:行者123 更新时间:2023-11-30 01:24:04 24 4
gpt4 key购买 nike

这段代码:

#include <stdio.h>
#include <iostream>
using namespace std;
int main() {
cout << fileno(stdout) << endl;
}

在此编译器中工作正常:http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.7.2/32-bit/threads-posix/sjlj/x32-4.7.2-release-posix-sjlj-rev6.7z

但在这个包中:http://nuwen.net/files/mingw/mingw-9.5-without-git.exe

它返回:test.cpp:5:24: error: 'fileno' was not declared in this scope

最佳答案

MinGW 有 fileno。从我的 MinGW 窗口:

$ grep -r fileno c:/mingw/include
c:/mingw/include/stdio.h:_CRTIMP int __cdecl __MINGW_NOTHROW _fileno (FILE*);

c:/mingw/include/stdio.h:_CRTIMP int __cdecl __MINGW_NOTHROW fileno (FILE*);
c:/mingw/include/stdio.h:#define _fileno(__F) ((__F)->_file)
c:/mingw/include/stdio.h:#define fileno(__F) ((__F)->_file)

糟糕,不幸的是,问题是 MinGW 做了一些极其愚蠢的事情。它使 stdio.h(一个与 GCC 无关的库)扩展的可见性成为 GCC 特定方言控制标志的主题。

Cygwin 也有这个问题,几年前在 Cygwin 邮件列表中的一个讨论线程中,他们强烈否认这是一个问题。

正确的方法是使用_POSIX_SOURCE_XOPEN_SOURCE等特征选择宏。 (这些宏近年来激增并且变得更加复杂。)

即使指定了 --ansi,MinGW 也应该在命令行上遵守 -D_POSIX_SOURCE 并显示 fileno

现在的情况是,您必须妥协语言方言并接受 GCC 扩展和不合规,只是因为您希望 POSIX 函数声明可见。

不过,我想出了一个解决方法,它不涉及在源代码中做任何丑陋的事情。看这个:

gcc -Wall -ansi -pedantic -U__STRICT_ANSI__ foo.c -c

就是这样。在 MinGW 上,我们没有使用像 -D_POSIX_SOURCE 这样的特征选择宏,而是使用 -U__STRICT_ANSI__ 来去除 GCC 的宏。

我在我的 ./configure 脚本中添加了一个测试来检测这种损坏的情况,并将 -U__STRICT_ANSI__ 添加到 CFLAGS。在我的项目中就像一个魅力。

关于c++ - nuwen.net MinGW Distro 中没有 `fileno()` 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14172884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com