C++ typedef和非简单类型说明符

C++ typedef和非简单类型说明符,c++,c,language-lawyer,C++,C,Language Lawyer,为什么这个代码无效 typedef int INT; unsigned INT a=6; 而下面的代码是有效的 typedef int INT; static INT a=1; ? 根据我的理解,unsigned int不是“简单类型说明符”,因此代码的格式不正确。不过我不确定 有人能指出标准的相关部分吗?,它使第一个代码无效(第二个代码有效) 编辑 虽然答案似乎是正确的,而且切中要害(顺便说一句,他删除了他的答案),但我还是接受了詹姆斯·科伦的答案,因为它正确而精确。 7.1.1:sta

为什么这个代码无效

typedef int INT;
unsigned INT a=6;
而下面的代码是有效的

typedef int INT;
static INT a=1; 
?

根据我的理解,
unsigned int
不是
“简单类型说明符”
,因此代码的格式不正确。不过我不确定

有人能指出标准的相关部分吗?,它使第一个代码无效(第二个代码有效)

编辑

虽然答案似乎是正确的,而且切中要害(顺便说一句,他删除了他的答案),但我还是接受了詹姆斯·科伦的答案,因为它正确而精确。

  • 7.1.1:static是存储类说明符。它可以放在前面 任何类型
  • 7.1.5:什么是类型说明符(unsigned可以与char组合, 长、短或整数)

typedef
s与宏不同。它们不仅仅是文本替换。Typedef创建一个新的typename

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


所以,当你说
typedefint
然后
INT
是完整的类型名。它不能被修改


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

不要忘记类型定义与宏定义不同;在您的示例中,如果您认为INT应该被视为一个literal
INT
。从编译器的角度来看,typedef定义了类型别名,但在“语法”级别上看不到这一点(typedef-ed类型在语法级别上类似于“原生”类型);既然在这个级别上,unsigned在char long short或int only之前是允许的,出于好奇,你的
unsigned int
被看作是一个“类型”(“与char,long,short,int不同”),前面加上
unsigned

,你为什么要这样做呢?没有太多理由重新定义<代码>类型定义无符号整数UINT可能更有意义,但是…是的,我知道,实际上我永远不会实际编写这样的代码。然而,我很好奇为什么第一个代码不起作用?因此,这个问题也被标记为
语言律师
。我知道这不是主要主题,但你可以写“std::make_unsigned::type”(参见)
typedef int被认为是有害的。以及
typedef
的其他荒谬用法。简而言之,
typedef int-tokenid
类型定义int音频样本有意义<代码>类型定义
typedef int-gint
只是用垃圾污染了您的代码库,使其难以重用。如果这让您感觉更好,在回答他的问题之前,只需将
INT
替换为
tokenid
unsigned
本身也可以是一个类型。并且隐式地限定为INT type+1,但不太复杂,但是正确,如果他对standardese有任何了解,我怀疑这些章节号会对他有所帮助。@Johannes:是的,他的答案是正确的,但我接受了James的答案,因为他的答案也很详细。顺便问一下,你为什么要删除你的答案?:)C++0x标准第3.9.1节第3段列出了无符号整数类型,并支持您的答案
unsigned int
是名称中有空格的类型<代码>无符号
不会作为另一种类型的修饰符列出,从而神奇地使其非负。