Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在C语言中重载是不可能的? 我知道C中不可能重载,我想知道:为什么C++中的类和类之外的重载函数在C++中被处理了? 考虑C++中的函数,其中函数在类之外声明: foo() foo(char c) foo(int a, int b) C中的每个函数都被转换成同名的符号,而C++中的名称被篡改。_C++_C_Oop_Overloading - Fatal编程技术网

为什么在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精神的某些方面可以用以下短语概括:

  • 相信程序员
  • 不要阻止程序员做需要做的事情
  • 保持语言简洁。
  • 仅提供一种执行操作的方法
  • 即使不能保证它的便携性,也要让它快一点
此外,C努力保持向后兼容旧版本;例如,旧式声明在C89中被标记为过时,但仍然是C11的一部分。同上,第2页:

现有代码很重要,而现有实现则不重要。存在大量C代码 具有相当大的商业价值。我们已尽一切努力确保 任何符合本标准的实施都可以接受本规范。C89委员会 不想强迫大多数程序员修改他们的C程序只是为了让他们被接受 由合格的翻译人员翻译

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

int foo(int);
int foo(char);
...
    foo('x');
<>在C++中,调用了<代码> fo(char),但是在C中, x '< /Cype >类型为<代码> int >代码>,因此结果要么相当令人惊讶,要么<代码> x '< /C> >需要是<代码> char < /> >类型,可能会破坏现有代码。此外,您可能需要一些有意义的升级,例如,在上一个示例中,如果没有给出
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语言)不支持一种新语言中的功能时,答案通常是