i686-w64-mingw32-g++编译报__int8 does not name a type错误解决
报错原因
__int8/__int16/__int32/__int64是MSVC(Visual Studio默认编译器)的专属非标准内置类型,MinGW所用的GCC编译器默认不识别这类类型,因此会报“does not name a type”错误。- 你后续替换的
__int8_t/__uint8_t属于编译器内部保留的标识符(双下划线开头的标识符默认保留给编译器实现用),不是对外暴露的标准类型;且你引入的<stdio.h>是标准输入输出头文件,根本不包含固定宽度整数类型的定义,自然改完还是报错。
解决方法
方案1:使用标准固定宽度整数类型(推荐,跨编译器兼容性最好)
C/C标准从C99、C11开始就规定了固定宽度整数类型,定义在<cstdint>(C++环境)或<stdint.h>(C环境)头文件中,MSVC、GCC、Clang等所有主流编译器都支持,直接用即可:
// C++环境包含这个头文件,C环境换成#include <stdint.h> #include <cstdint> // 有符号整数别名 typedef int8_t Int8; typedef int16_t Int16; typedef int32_t Int32; typedef int64_t Int64; // 无符号整数别名 typedef uint8_t Uint8; typedef uint16_t Uint16; typedef uint32_t Uint32; typedef uint64_t Uint64;
注意:标准类型名是
int8_t/uint8_t,前面不要加双下划线。这类类型的长度是标准明确规定的,和MASM的类型对应关系非常清晰,做混合编程时反而比MSVC专属类型更不容易出匹配错误:
- 1字节宽的
Int8/Uint8对应MASM的BYTE- 2字节宽的
Int16/Uint16对应MASM的WORD- 4字节宽的
Int32/Uint32对应MASM的DWORD- 8字节宽的
Int64/Uint64对应MASM的QWORD
方案2:开启GCC的MSVC兼容扩展,保留原有代码写法
如果你不想修改已有的__int8风格代码,编译时给MinGW的g++加上-fms-extensions编译参数,开启MSVC语法兼容扩展即可识别这些类型,示例编译命令:
i686-w64-mingw32-g++ 你的源文件.cpp -fms-extensions -o 输出程序.exe
内容的提问来源于stack exchange,提问作者I_4m_Z3r0
相关产品推荐
相关产品推荐

