Visual c++ 意外错误C2632:&x27;char';其次是';char';是非法的

Visual c++ 意外错误C2632:&x27;char';其次是';char';是非法的,visual-c++,compiler-errors,Visual C++,Compiler Errors,我有一段代码作为 typedef unsigned char _uint8; typedef unsigned short _uint16; typedef unsigned int _uint32; typedef float _float32; typedef char _int8; typedef short _int16; typedef int

我有一段代码作为

    typedef unsigned char   _uint8;
    typedef unsigned short  _uint16;
    typedef unsigned int    _uint32;
    typedef float           _float32;

    typedef char            _int8;
    typedef short           _int16;
    typedef int             _int32;
最后三行中的行出现了错误

错误消息是

错误C2632:“char”后跟“char”是非法的
错误C2632:“short”后跟“short”是非法的


错误C2632:“int”后跟“int”是非法的

这些类型已经通过
typedef
(可能)或
#define
(更有可能)在代码尝试执行之前创建;看一下预处理器输出(如果VisualC++可以做到这一点),可以帮助你找到为什么是./P>< P>在C和C++中,它是非法的(调用未定义的行为)来定义自己的标识符,标识符从下划线开始。只有编译器和标准库才允许使用以下划线开头的名称。这些特定名称(
\u int8
等)似乎已经被定义为宏或内部类型

你必须选择不同的名字

引用 根据n1570§7.1.3

所有以下划线开头的标识符始终保留为在普通和标记名称空间中用作具有文件范围的标识符

如果程序在保留标识符的上下文中声明或定义标识符(7.1.4允许的除外),或将保留标识符定义为宏名称,则该行为未定义

因此,通过尝试定义类型
\u int8
,程序将调用未定义的行为。“未定义的行为”是一个技术术语,它意味着编译器不作任何保证:可能会收到错误消息,可能会按预期工作,或者可能会完全发生其他事情。可能不会出现错误消息,但您的程序无法正常工作

例子 请尝试在Visual Studio中编译以下代码

int main()
{
    _int8 x = 1;
    return 0;
}

它汇编了。。。这意味着编译器已经在使用
\u int8
来定义类型。它似乎是一种未记录的类型,因为MSDN搜索没有结果。但无论如何,您都不允许定义自己的
\u int8

这是由include-guard符号还是“pragma”保护的?这段代码是否自行编译?前面是什么?你有一个
#define(定义)int8 char
但在同一组代码中,前四行怎么不会抛出任何错误,即使它们以下划线开头…@Matt:“Undefined behavior”并不保证会出现错误消息,只是它不能保证工作。也许它会工作,也许它会出错,也许它会做一些完全出乎意料的事情。通常,以下划线开头的标识符只是保留的,它们不一定是非法的:。
\u int8
将自己编译的事实表明Visual Studio已经违反了ANSI标准。@DrRobotNinja:错,请重新阅读该部分。n1570§7.1.3:“不保留任何其他标识符。如果程序在保留标识符的上下文中声明或定义标识符(7.1.4允许的除外),或将保留标识符定义为宏名称,则该行为未定义。”(强调添加)@DietrichEpp:Ah,好的。我误解了n1570 7.1.3.1.2中“文件范围”的含义