为什么在C中不能超载?

Ven*_*esh 7 c c++ oop overloading

我知道在C中不可能进行重载,我想知道:为什么类中的重载函数和类外部在C++中处理相同?

在C++中考虑这种情况,其中函数在类外声明:

foo()
foo(char c)
foo(int a, int b)
Run Code Online (Sandbox Code Playgroud)

如果C++将每个函数头视为唯一,为什么C不能这样做呢?

我认为这些可能是原因:

  • 函数重载是在C++中引入的,因此在C中不可用.
  • 多态性是一种OOP概念,但C不是面向对象的.

C中是否存在函数重载不可用的原因?

Grz*_*ski 8

您可能会在C99理论中找到一些有趣的观点7.22/25 类型通用数学 <tgmath.h>:

例如,对整数和浮点类型重载的能力对某些函数很有用copysign.用不同数量的参数超载将允许重复使用的名称,例如remainderremquo.但是,这些设施会使规范变得复杂; 并且它们的自然一致使用,例如浮动绝对或双参数,会导致与C89的进一步不一致,因为效益不足.

此外,C11标准引入了类型_Generic宏,允许某种类型的重载,从某种意义上说,不同的类型可以作为类似函数的宏参数来处理.


maf*_*fso 8

也许最重要的原因是缺乏现有技术.标准委员会向C添加的功能的例子非常少,既没有流行的扩展,也没有必要编写严格符合的代码.

有一些模糊定义的"C精神",C99基本原理(V5.10)读取(第3页,emph.mine):

C精神的一些方面可以概括为以下短语:

  • 相信程序员.
  • 不要阻止程序员做需要做的事情.
  • 保持语言小而简单.
  • 只提供一种方法来进行操作.
  • 即使不保证便携,也要快速.

此外,C努力保持向后兼容旧版本; 例如,旧式声明在C89中已被标记为过时,但仍然是C11的一部分.同上,第2页:

现有代码很重要,现有实现则不然.大量的C代码存在相当大的商业价值.我们已尽一切努力确保符合标准的任何实现都能接受大部分代码.C89委员会不希望强迫大多数程序员修改他们的C程序,只是为了让他们接受合格的翻译.

C和C++中的一些差异至少部分是由函数重载引起的,例如字符常量的类型:

int foo(int);
int foo(char);
...
    foo('x');
Run Code Online (Sandbox Code Playgroud)

在C++中,这个调用foo(char),但在C中,类型'x'int,所以结果可能相当令人惊讶,或者'x'需要是类型char,可能会破坏现有代码.此外,你可能想一些促销活动,他们是有意义的,例如,如果在最后一个例子中,第二个声明foo中没有给出,'x'会被提升到intfoo(int)被调用.这些规则可能会变得很复杂(应该void *隐式转换为函数调用?).(这不是一个很难的数字,但是关于n3797草案中C++标准(第13章)中函数重载的章节大约有30页,同上.5.2.2关于函数调用的内容比相应的C标准部分要长得多.)

几乎C的每个特征都是最小语言所必需的(好的,模数历史遗产),语法糖很少; 函数重载可以考虑这样的(你能说出你的职责foo_intfoo_char等,并明确调用正确的).

你建议的原因是循环的(因此不适用):C确实采用了一些C++特性(例如函数原型); 函数重载是在C++中引入的,因为C缺少它(你不能说"它不是C的一部分,因为它是C++的一部分;它是C++的一部分,因为它不是C的一部分").关于C和OOP的第二个建议也是如此.

我个人对C的看法是它与机器的关系非常接近.通常很容易看出C代码生成的汇编器输出与它有什么关系.符号名称是非符号的,可以很容易地识别.语言简单易懂.坦率地说,当他们想要将某些C++特性结合到C中时,我不明白人们的追求:我们有C++,一种提供这些东西的语言,能够编写特定于平台的高效代码; 为什么不用它呢?

C11介绍_Generic,可能对您有用.