18

为什么此代码无效?

typedef int INT;
unsigned INT a=6;

而下面的代码是有效的

typedef int INT;
static INT a=1; 

?

根据我的理解unsigned int,不是一个"simple type specifier",所以代码格式不正确。不过我不确定。

谁能指出Standard使第一个代码无效(而第二个代码有效)的相关部分?

编辑

尽管Johannes Schaub 的回答似乎是正确的,而且中肯(顺便说一句,他已经删除了他的回答),但我接受了 James Curran 的回答,因为它的正确性和准确性。

4

3 回答 3

29

typedefs 不像宏。它们不仅仅是文本替换。Typedef 创建一个新的类型名。

现在,当您说 时unsigned intunsigned不是附加在 . 上的修饰符intunsigned int是完整的类型名;它恰好有一个空间。

所以,当你说typedef int INT; thenINT是完整的类型名时。它不能被修改。

static(like const) 是一个存储类说明符。它实际上不是类型名称的一部分。

于 2010-07-20T13:47:01.083 回答
12
  • 7.1.1 : static 是一个存储类说明符。它可以放在任何类型之前。
  • 7.1.5:什么是类型说明符(unsigned 可以与 char、long、short 或 int 组合)
于 2010-07-20T13:24:51.917 回答
2

不要忘记 typedef-ing 不像宏定义。在您的示例中,似乎您认为您的 INT 应该被视为文字int。从编译器的角度来看,typedef 定义了类型别名,但这在“语法”级别上看不到(typedef-ed 类型就像语法级别的“本机”类型);并且由于在该级别 unsigned 仅允许在 char long short 或 int 之前使用,因此您unsigned INT被视为前面带有unsigned.

于 2010-07-20T14:00:09.897 回答