typedef和非简单类型说明符

时间:2010-07-20 13:15:28

标签: c++ c language-lawyer

为什么这段代码无效?

typedef int INT;
unsigned INT a=6;

而以下代码有效

typedef int INT;
static INT a=1; 

根据我的理解,unsigned int不是"simple type specifier",因此代码格式不正确。我不确定。

任何人都可以指向Standard的相关部分,它使第一个代码无效(第二个代码有效)吗?

修改

虽然Johannes Schaub's答案似乎是正确的并且到了这一点(他已经删除了他的答案BTW)但我接受了James Curran的答案,因为它的正确性和准确性。

3 个答案:

答案 0 :(得分:29)

typedef与宏不同。它们不仅仅是文本替换。 Typedef会创建一个新的类型名称。

现在,当您说unsigned int时,unsigned不是添加到int的修饰符。 unsigned int是完整的类型名称;它碰巧有一个空间。

因此,当您说typedef int INT;时,INT就是完整的类型名称。它无法修改。

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

答案 1 :(得分:12)

  • 7.1.1:static是存储类说明符。它可以放在之前 任何类型。
  • 7.1.5:什么是类型说明符(unsigned可以与char结合使用, 长,短或int)

答案 2 :(得分:2)

不要忘记typedefing不像宏定义;在你的例子中,似乎你认为你的INT应该被视为文字int。从编译器的角度来看,typedef定义了类型别名,但是在“语法”级别没有看到这种情况(typedef-ed类型在语法级别上类似于“native”类型);因为在那个级别,在char long short或int之前允许unsigned,你的unsigned INT被看作是unsigned之前的“type”(与char,long,short,int“不同”)。