调用WriteConsole时包括stdio会导致错误。

3
#include <stdio.h>
#include <windows.h>

using namespace std;

int main() {
  char s[] = "Hello\n";
  HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
  unsigned long cChars;
  WriteConsole(stdout, s, lstrlen(s), &cChars, NULL);
}

结果:错误:将'_iob'声明为引用数组'

但是当我注释掉stdio.h时,它就可以编译通过了。这里出了什么问题?

编译器是MinGW。


它是否会同时提供错误的行号或文件名?更改#include的顺序是否会有影响? - David Schwartz
是的,错误指向标准输出(stdout),这就是问题所在,它是保留名称。 - rsk82
2个回答

7

根据不同的平台,stdout 可能是一个宏,所以最好不要使用该名称。请替换为其他变量名。

HANDLE stdout = ...

使用

HANDLE out = ...

然后

WriteConsole(out, ...

stdout被定义在stdio.h中,这就是为什么只有在包含这个文件时它才会失败。但为了安全起见,请不要使用该名称来命名任何自定义变量。


+1 头文件中有这个:#define stdout (&_iob[STDOUT_FILENO]) - David Schwartz
这不是“取决于平台”。标准说它是一个宏。 - user784668

1

stdout已经被系统定义了.. 尝试将其更改为_stdout或其他名称


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接