加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 04:55:00 所属栏目:百科 来源:网络整理
导读:我知道在C中不可能进行重载,我想知道:为什么类中的重载函数和类外的函数在C中处理相同? 在C中考虑这种情况,其中函数在类外声明: foo()foo(char c)foo(int a,int b) 如果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,这可能是您感兴趣的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读