2012-11-30 230 views
1

是否有效的C++有一个基本类型的typedef到另一个基本类型?typedef - 原始类型到原始类型

typedef int long; 

在VS 2012上,发出了警告,但编译正常。

warning C4091: 'typedef ' : ignored on left of 'long' when no variable is declared

但是在gcc-4.3.4上,它失败了。

error: declaration doesnot declare anything.

哪个编译器符合标准?

PS:我不会在生产代码中写这样的东西。想出了这个想法和检查。

+2

不知道,但这似乎对我来说是一个可怕的想法。第一个问题是你已经确定的问题。除此之外,任何来到您项目中的新程序员都可能会被愚弄在查看代码中。当代码需要移植到int意味着不同的系统(例如更大)的系统时会发生什么? –

+0

@JonathanWood我明白,但只是在这里检查语言规则。我不会写这样的东西。 – Mahesh

回答

7

Is it valid C++

号C++ 11,第7.1.3.6:

In a given scope, a typedef specifier shall not be used to redefine the name of any type declared in that scope to refer to a different type.

+1

我相信它实际上是有效的C++。它不会被解析为int类型的long类型,而是作为int long类型的定义(与long int类型或long类型相同),指定没有名称给类型。如果例子是例如'typedef int char;'代替。 – Angew

+0

由于您引用的原因,OP要完成的操作不可能,但应该注意的是,它不是收到错误/警告的原因。错误/警告是因为“int long”被解释为单一类型,所以typedef不起作用。 VC++警告并继续在这种情况下。 GCC更严格。哪一个更正确 - 谁知道。它可能是编译器的一个实现细节。 –

+0

@Cat Plus Plus为什么不能用这种方式解释规则(http://ideone.com/FbB7ZY)? – Mahesh

5

他们都说同样的事情,但有人报告它是一个错误。请注意,VS警告说“typedef被忽略。”事情是int longlong int是同义词,所以你基本上创建一个未命名的typedeflong

2

无论做什么标准的要求。该typedef无效,并且两个编译器都会发出诊断信息。