c – 为什么C中不能超载?

前端之家收集整理的这篇文章主要介绍了c – 为什么C中不能超载?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道在C中不可能进行重载,我想知道:为什么类中的重载函数和类外的函数在C中处理相同?

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

foo()
foo(char c)
foo(int a,int b)

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

我认为这可能是原因:

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

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

解决方法

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

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

Some of the facets of the spirit of C can be summarized in phrases like:

  • Trust the programmer.
  • Don’t prevent the programmer from doing what needs to be done.
  • Keep the language small and simple.
  • Provide only one way to do an operation.
  • Make it fast,even if it is not guaranteed to be portable.

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

Existing code is important,existing implementations are not. A large body of C code exists
of considerable commercial value. Every attempt has been made to ensure that the bulk of this
code will be acceptable to any implementation conforming to the Standard. The C89 Committee
did not want to force most programmers to modify their C programs just to have them accepted
by a conforming translator.

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

int foo(int);
int foo(char);
...
    foo('x');

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

几乎C的每个特征都是最小语言所必需的(好的,模数历史遗产),语法糖很少;函数重载可以被认为是这样的(您可以将函数命名为foo_int和foo_char等,并显式调用正确的函数).

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

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

C11介绍了_Generic,这可能是您感兴趣的.

猜你在找的C&C++相关文章