13

老熟人:

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

这种语法是完美的。没问题。

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

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

只是为了迷惑程序员?这种语法是否在任何地方都需要(实际上我们已经使用了前一种)?从编译器的角度你怎么看?他们觉得它可爱还是疯狂?还是对编译器根本不重要?


顺便说一句,这段代码来自这里: 使用 typename 关键字与 typedef 和 new

如果您想知道这是否是语法错误,请查看ideone的工作代码

4

4 回答 4

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++ 的语法也可能会有所帮助。

于 2010-12-12T17:27:12.110 回答
1

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

它的唯一意义A typedef B是您是否认为typedef是二元运算符(在类型赋值的意义上A = B)。

于 2010-12-12T17:16:25.013 回答
0

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

于 2010-12-12T17:14:29.130 回答