c – 为什么C中不能超载?
我知道在C中不可能进行重载,我想知道:为什么类中的重载函数和类外的函数在C中处理相同?
在C中考虑这种情况,其中函数在类外声明: foo() foo(char c) foo(int a,int b) 如果C将每个函数头视为唯一,为什么C也不能这样做? 我认为这可能是原因: >函数重载在C中引入,因此在C中不可用. C中是否存在函数重载不可用的原因? 解决方法
也许最重要的原因是缺乏现有技术.标准委员会为C添加的功能很少,这些功能既没有流行的扩展,也没有必要编写严格符合的代码.
有一些模糊定义的“C精神”,C99理论基础(V5.10)读取(第3页,emph.mine):
此外,C努力保持向后兼容旧版本;例如,旧式声明在C89中已被标记为过时,但仍然是C11的一部分.同上,第2页:
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,这可能是您感兴趣的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |