调用 WriteConsole 时包含 stdio 会导致错误

Posted

技术标签:

【中文标题】调用 WriteConsole 时包含 stdio 会导致错误【英文标题】:including stdio when calling WriteConsole results in error 【发布时间】:2012-06-10 10:49:33 【问题描述】:
#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);

结果:error: declaration of '_iob' as array of references

但是当我注释掉stdio.h 时,它编译正常。这里有什么问题?

编译器是 MinGW。

【问题讨论】:

它是否给出了文件名的行号以及错误?更改#include 的顺序会改变什么吗? 是的,错误指向标准输出,这就是问题所在,它是保留名称。 【参考方案1】:

视平台而定,stdout 可能是一个宏,所以最好不要使用该名称。替换

HANDLE stdout = ...

HANDLE out = ...

然后

WriteConsole(out, ...

stdout 在 stdio.h 中定义,这就是为什么它仅在包含此文件时才会失败。但为了安全起见,切勿为任何自定义变量使用该名称。

【讨论】:

+1 头文件有这个:#define stdout (&amp;_iob[STDOUT_FILENO]) 这不是“取决于平台”。 标准说它是一个宏。【参考方案2】:

标准输出已经由系统定义..尝试将其更改为 _stdout 或其他内容

【讨论】:

以上是关于调用 WriteConsole 时包含 stdio 会导致错误的主要内容,如果未能解决你的问题,请参考以下文章

WriteConsole() 奇怪的字符?

如何使用 WinApi 的 WriteConsole 打印 LOCAL 字节

C++中用writeconsole函数往控制台写字符串出现乱码,求救!

#include <stdio.h>是啥意思

C语言程序设计中的#include<stdio.h>是啥意思?

[Code Composer Studio] 使用C I/O函数必须包含stdio.h