【问题标题】:C++ crazy typedef : what is the point of allowing this syntax by the Standard?C++ 疯狂 typedef:标准允许这种语法有什么意义?
【发布时间】:2011-05-24 07:06:09
【问题描述】:

老熟人:

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

【问题讨论】:

  • C++/C 几乎是为了迷惑程序员而设计的。一个明确的设计目标是最大限度地提高您可以编写的表达式的复杂性 - 好处是您可以以不同的方式编写极其复​​杂的代码 - 缺点是您可以以不同的方式编写极其复​​杂的代码。
  • @James 如果你想看到一种能够最大限度地提高表达式复杂性的语言,你应该学习 perl。
  • 老实说,我不认为编译器有任何可爱或疯狂的概念......这是一个 GIGO 世界。
  • 我认为你只是习惯于使用“可爱”而不是“疯狂”的。 typedef 不是sizeof 之类的运算符,但似乎被视为修饰符,例如constvolatile
  • @BoltClock : GIGO 这个词听起来很有趣!

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


【解决方案1】:

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

【讨论】:

  • 这可能有一点解释,如果你沿着这条线思考:a[1] => *(a+1) => *(1+a) = > 1[a]。
  • 这个和汇编寻址很相似,所以没有那么不合逻辑。
【解决方案2】:

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

拥有A typedef B 的唯一意义是,如果您将typedef 视为二元运算符(在类型赋值的意义上为A = B)。

【讨论】:

  • 看来typedefconst 是同一个词组(你可以写const int aint const a)。
  • @Pawel:这个集合叫做:“decl-specifier”
  • 只要语法明确,它不会真正使解析“更难”。
【解决方案3】:
【解决方案4】:

问题是“为什么它让你感到困惑?”

语法来源于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++ 的语法也会有所帮助。

【讨论】:

  • @ybungalobill :就了解不同的语法而言,这篇文章很好。但问题仍然是一样的:为什么允许不同的语法来实现同样的事情?真正的问题是,它让程序员感到困惑,哪些语法“真正”不同并且确实做了不同的事情,以及哪些语法不同但做同样的事情。程序员需要记住,比如说,6 种语法,它们只做 2 种不同的事情!
  • @Nawaz:问题是您认为这两种形式是不同的语法,但它们实际上是相同的。所以我可以争辩说,这样你就不需要记住先出现的顺序 inlineconstfriendint
  • @ybungalobill :如果您在理解我的评论时遇到困难,请将“语法”一词替换为“表单”。我的意思是,只要有多个表单做完全相同的事情,语法就会令人困惑,因为还有其他一组表单做另一件事。试想一下,你有 100 个表格做一件事,另外 100 个表格做另一件事。这些表格使不必要的困难!
  • @Nawaz:我不同意。我不知道你的母语是什么,但在例如在俄语中,您可以通过 6 种可能的方式对“you verb noun”中的单词进行排序。然而它不会混淆任何人。我认为它也适用于计算机语言。
  • 当我用 C# 编写时,它总是让我很恼火,它强制执行“虚拟”和“覆盖”等顺序。
猜你喜欢
  • 2011-10-27
  • 2013-02-04
  • 1970-01-01
  • 2016-09-05
  • 2021-04-26
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多