3

我有一段代码

    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' 是非法的

4

2 回答 2

2

在您的代码尝试执行之前,这些类型已经通过typedef(可能)或(更有可能)创建;#define查看预处理器输出(如果使用 Visual-C++ 可能的话)可以帮助您找出原因。

于 2013-08-26T17:12:22.557 回答
2

在 C 和 C++ 中,定义您自己的以下划线开头的标识符是非法的(调用未定义的行为)。只有编译器和标准库允许使用以下划线开头的名称。这些特定名称(_int8等)似乎已被定义为宏或内在类型。

您必须选择不同的名称。

引文

从 n1570 §7.1.3,

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

...

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

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

例子

尝试在 Visual Studio 中编译以下代码...

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

它编译......这意味着_int8编译器已经在使用它来定义一个类型。它似乎是一种未记录的类型,因为 MSDN 搜索一无所获。_int8但是无论如何你都不能定义你自己的。

于 2013-08-26T17:13:07.330 回答