为什么在C语言中重载是不可能的? 我知道C中不可能重载,我想知道:为什么C++中的类和类之外的重载函数在C++中被处理了? 考虑C++中的函数,其中函数在类之外声明: foo() foo(char c) foo(int a, int b) C中的每个函数都被转换成同名的符号,而C++中的名称被篡改。
我认为这可能是原因:为什么在C语言中重载是不可能的? 我知道C中不可能重载,我想知道:为什么C++中的类和类之外的重载函数在C++中被处理了? 考虑C++中的函数,其中函数在类之外声明: foo() foo(char c) foo(int a, int b) C中的每个函数都被转换成同名的符号,而C++中的名称被篡改。,c++,c,oop,overloading,C++,C,Oop,Overloading,我认为这可能是原因: 在C++中引入了函数重载,因此在C.中不可用 多态性是一个面向对象的概念,但C不是面向对象的 C中函数重载不可用有什么原因吗?我想说,C没有函数重载的首要原因是C不会损坏函数名: > C中的每个函数都被转换成同名的符号,而C++中的名称被篡改。 例如: 发挥你的作用: void foo() void foo(char c) void foo(int a, int b) C++代码所损坏的符号名称将如下: void foo() = _Z3foov void foo(
- 在C++中引入了函数重载,因此在C. 中不可用
- 多态性是一个面向对象的概念,但C不是面向对象的
C中函数重载不可用有什么原因吗?我想说,C没有函数重载的首要原因是C不会损坏函数名: <> > C中的每个函数都被转换成同名的符号,而C++中的名称被篡改。 例如: 发挥你的作用:
void foo()
void foo(char c)
void foo(int a, int b)
<> C++代码所损坏的符号名称将如下:
void foo() = _Z3foov
void foo(char c) = _Z3fooc
void foo(int a,int b) = _Z3fooii
在C代码中,这将转换为:
void foo() = foo
底线C++允许名称修改,因此编译器“更改”函数名和所有引用到三个不同的名称
在最新的标准中,C不允许名称被篡改(我怀疑这种情况是否会改变),所以这样的解决方案是不可能的。您可能会在7.22/25类型的通用数学中发现一些有趣的观点
:
在整数和浮点类型上重载的能力将
对于某些功能非常有用,例如copysign
。超载
使用不同数量的参数将允许重用名称,
例如remquo
的余数
。然而,这些设施将有
规范复杂化;以及它们的自然一致使用,例如
至于浮动abs或双参数atan,会引入
由于效益不足,与C89进一步不一致
另外,标准引入了类型
\u Generic
宏,它允许某种类型的重载,从某种意义上说,不同的类型可以作为类似于宏参数的函数来处理。也许最重要的原因是缺乏现有技术。由标准委员会添加到C的特性的例子很少,这些特性以前既不是流行的扩展,也不是编写严格一致的代码所必需的
有一些模糊定义的“C精神”,C99基本原理(V5.10)如下(第3页,emph.mine):
C精神的某些方面可以用以下短语概括:
- 相信程序员
- 不要阻止程序员做需要做的事情
- 保持语言简洁。
- 仅提供一种执行操作的方法
- 即使不能保证它的便携性,也要让它快一点
int foo(int);
int foo(char);
...
foo('x');
<>在C++中,调用了<代码> fo(char),但是在C中,foo
的第二个声明,'x'
将升级到int
并调用foo(int)
。这样的规则在细节上可能变得复杂(是否应该为函数调用隐式转换void*
)。(不是一个硬数字,但是在N397草案中关于C++函数的函数重载的章节(第13章)大约30页,第二章关于函数调用的长度比相应的C标准部分长很多。)
C语言的几乎每一个特性都是最小语言所必需的(好吧,模历史遗产),几乎没有语法糖分;函数重载可以被认为是这样的(您可以将函数命名为foo_int
和foo_char
等,并显式调用正确的函数)
你提出的原因是循环的(因此不适用):C确实采用了一些C++特性(例如函数原型);函数重载在C++中被引入,因为C缺少它(你不能说它不是C的一部分,因为它是C++的一部分,它是C++的一部分,因为它不是C的一部分)。关于C和OOP的第二个建议也是如此
我个人喜欢C语言的地方在于它与机器的映射相当接近。通常很容易看出C代码生成的汇编程序输出与它的关系。符号名称是不混在一起的,很容易识别。语言保持简单和最少。坦白地说,我不明白人们在看到某些C++特性被并入C时所追求的东西:我们有C++,一种提供这些东西的语言,能够编写特定于平台的、高效的代码;为什么不直接使用它呢C11介绍了
\u Generic
,这可能会引起您的兴趣。这里有3个非常不同的问题。哪一种对你来说最重要?每当你问自己为什么一种语言(任何语言,不仅仅是C语言)不支持一种新语言中的功能时,答案通常是