调用 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 (&_iob[STDOUT_FILENO])
这不是“取决于平台”。 标准说它是一个宏。【参考方案2】:
标准输出已经由系统定义..尝试将其更改为 _stdout 或其他内容
【讨论】:
以上是关于调用 WriteConsole 时包含 stdio 会导致错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 WinApi 的 WriteConsole 打印 LOCAL 字节
C++中用writeconsole函数往控制台写字符串出现乱码,求救!