C ++ crazy typedef:标准允许这种语法有什么意义?

时间:2010-12-12 17:06:14

标签: c++ typedef standards-compliance iso user-defined-types

熟悉的老人:

typedef int cute_int; //cute : common and familiar syntax. 

这种语法很完美。没问题。

现在,当我们可以像上面那样编写typedef时,那么允许这种语法是什么意思:

int typedef crazy_int; //crazy : uncommon and unfamiliar syntax.

只是为了迷惑程序员?甚至在任何地方都需要这种语法(实际上我们是前一个)?你从编译器的角度怎么看?他们发现它可爱还是疯狂?或者对编译器来说无关紧要?


顺便说一句,这段代码来自这里: Use of typename keyword with typedef and new

如果您想知道这是否是语法错误,请在ideone处查看the working code here

4 个答案:

答案 0 :(得分:10)

答案 1 :(得分:10)

问题是“为什么会让你困惑?”

语法来自C ++中声明说明符的语法,它非常通用,并且用于C ++中的许多内容。声明说明符的顺序无关紧要。看看这些:

int virtual f() const, *g(int);
int ptr1, *ptr2;
int typedef const *name1, name2;

这相当于:

virtual int f() const;
virtual int* g(int);
int ptr1;
int *ptr2;
typedef const int* name1;
typedef const int name2;

如果你仔细观察它们,你会发现语法实际上是统一的和合乎逻辑的。另外阅读C ++的语法可能有所帮助。

答案 2 :(得分:1)

我不知道这种语法,虽然我的g ++似乎接受了它......但是从编译器的角度来看,它会使解析更难:当你遇到int令牌时,你不知道是否你正在解析一个类型定义(并且typedef即将发生)或者你正在解析一个变量/函数定义......

如果您认为A typedef B是二元运算符(在类型赋值为typedef的意义上),那么A = B的唯一意义就是。

答案 3 :(得分:0)

我不确定标准是否允许这样做。但是正如我们所知,c ++中有很多东西允许但却有不合逻辑的语法。例如,1[a], "hello"[2];// ...

这类事情