【问题标题】:Keyword for functions in C++?C++中函数的关键字?
【发布时间】:2020-01-31 08:40:27
【问题描述】:

为什么 C++ 没有关键字来定义/声明函数?基本上该语言中的所有其他设计抽象都有一个(structclassconceptmodule、...)。

它不会使easier to parse 的语言更加一致吗?大多数“现代”语言似乎都是这样发展的(fn in rust,fun in kotlin,...)。

【问题讨论】:

  • 你的意思是,除了声明中的括号?
  • 是的,有一个实际的关键字使其明确。
  • 如果你喜欢你可以使用#define function 然后function int foo(){...}; :-)
  • IOCCC 2020 年奖颁给了@schorsch312 ...
  • 解析函数定义并不难。使 C++ 难以解析(实际上是图灵完备)的原因是模板。考虑一下:template<bool x, class C> void foo(C &c){ if(x) c.push_back(0); else c.push_back(1); } 及其在template<class C, int a, int b> void bar(C &c){ foo<a<b>(c); } 中的调用 解析器必须怀疑每个尖括号是模板实例化的一部分还是运算符。

标签: c++ function parsing keyword language-design


【解决方案1】:

C++ 的语法主要来自 C,而 C 不提供 function 关键字。相反,它使用某种语法来表示大多数功能:

[return type] [function name]([paramters]) { } 

因此,如果引入 function 关键字,我们可以获得更快的解析并提高可读性。但是,您现在将有 2 种不同的方式来声明某些内容,并且您可以 由于向后兼容的必要性,不能摆脱旧的方式。


但是让我们假设我们忽略了向后兼容性参数并假设它被引入:

function int square(int a) { //1
    return a * a; 
} 

//-----------------------------

function square(int a) { //2
    return a * a; 
} 

case 1 的行为就像一个关键字指示器,它有优点(可读性、解析)和缺点(用不必要的噪音向函数声明发送垃圾邮件)

case 2 是一种 javascript 风格的方法,让编译器找出返回类型(如 auto 此处)。这可能是最美观的方法,但 C++ 是非常静态类型的,当不需要它时这会增加一层混乱(auto-ness 可能有用,但肯定并不总是需要)。


因此,最终这些中等收益似乎并不能证明引入这样一个关键字所带来的成本是合理的。


额外的一点:

从 C++11 开始,语言特性将允许您争论一种特殊的方法:

function square(int a) -> int { 
    return a * a; 
} 

这肯定是一个非常可靠的解决方案!但似乎关于function 关键字的讨论早已平息。当在最新的 C++ 版本上进行创新时,还有许多其他可能更重要的优先事项需要讨论时,这是可以理解的。

【讨论】:

    【解决方案2】:

    好吧,尽管是一种现代语言(至少,我认为 C++17 是一种现代语言,但恕我直言),C++ 必须向后兼容大多数 C 和 C++ 版本是在过去 50 年左右创建的。那时它是一个全新的工作领域,没有人真正知道如何做得更好。那是1978年! C 的创造者认为这就足够了,完全是他们的决定。

    现在实施新关键字会破坏现有代码,所以我认为这样做是不行的。

    Rust、Kotlin 等现代语言有无可挑剔的时间来考虑什么是好的,什么不是基于当前存在的语言、过去使用然后消失的语言等等。

    老实说,我认为目前的语法还不错,不需要做任何事情。

    当然,最令人头疼的解析是一个问题,但对于几乎所有使用 C++ 的人来说,这是一个众所周知的问题。

    【讨论】:

      【解决方案3】:

      因为函数以另一种方式标识:通过其名称后的括号。请注意,函数来自C,它没有提到那些设计抽象。因此,添加一个奇怪的关键字不会有助于坚持某种语言设计。而且,少一个保留字也不是坏事。

      如果你真的想要一个函数关键字,你可以这样做:

      #define FUNC auto
      FUNC foo() -> Bar {
        baz();
      } 
      

      【讨论】:

      • 这个建议很像添加#define BEGIN {#define END } 等。在实际项目中进行这意味着将要加入该项目的新人需要学习一种基于已知语言的新语言...请不要在您的家庭宠物项目之外进行:-D跨度>
      • 使用定义来模仿其他语言的行为是一个非常糟糕的主意。
      • @Simon 这肯定很糟糕,但在您的小型本地项目中还可以。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-03-27
      • 2010-10-25
      • 2021-11-15
      • 2022-01-05
      相关资源
      最近更新 更多