显然(至少根据gcc -std=c99)C99不支持函数重载。之所以不支持一些C的新功能通常是向后兼容的,但在这种情况下,我不认为在函数重载将打破向后兼容性单宗。这背后不包括这个基本特征的理由?

有帮助吗?

解决方案

要明白为什么你可能不会看到用C超载,这可能有助于更好地了解如何重载用C ++处理。

编译代码之后,但在此之前它已准备好运行时,中间的对象代码必须链接。这种转换的编译功能和其他对象的粗糙数据库到准备加载/运行的二进制文件。这个额外的步骤很重要,因为它是模块化的可编译的程序的原理机制。这个步骤可以让你从现有的库采取的代码,并将其与自己的应用程序逻辑混合。

在该阶段,目标代码可能已被写入以任何语言,与特征的任意组合。要做到这一点,它必须有某种约定,以便链接能够挑选合适的对象时,另一个对象是指它。如果你用汇编语言编码,当你定义一个标签,该标签被准确使用,因为它假设你知道自己在做什么。

在C,功能变得链接器的符号名称,所以当你写

int main(int argc, char **argv) { return 1; }

的编译器提供的对象的代码,它包含对象称为main存档。

这工作得很好,但它意味着你不能有两个名称相同的对象,因为链接将无法决定应该使用的名称。链接器不知道参数类型什么,甚少在一般的代码。

C ++通过直接编码附加信息到符号名称解决此问题。参数的返回类型和数量和类型添加到符号名称,并在函数调用的点被称为这种方式。链接器不必知道这甚至发生,因为只要它可以告诉,函数调用是毫不含糊的。

这样做的缺点是符号名看起来不像原来的函数名什么。特别是,它几乎是不可能预测的重载函数的名称是什么,这样就可以链接到它。要链接到foriegn代码,你可以使用extern "C",这会导致这些功能遵循符号名的C形式,当然你不能重载这样的功能。

这些差异与每种语言的设计目标。 C朝着可移植性和互操作性地定向。 ç超出它的方式做预测和兼容的东西。 C ++是朝着建设富强系统更强烈导向,不是非常专注于与其他语言的交互。

我认为这是不可能对C永远追求将产生的代码,其是如难以与作为C ++进行交互的任何特征。

<强> 修改 意象问:

  

难道真的是少的便携式或   更难以与互动   功能,如果你解决INT主(INT   ARGC,字符** argv的)喜欢的东西   主要-INT-INT炭的**,而不是主   (这是标准的一部分)?   我没有在这里看到的一个问题。事实上,   在我看来,这个给你   更多的信息(其可用于   为优化等)

要回答这个问题,我会向C ++,并与重载交易的方式再次打开。 C ++使用这种机制,几乎完全一样的说明,但有一点需要注意。 C ++不规范本身的某些部分应如何实施,然后继续提出一些如何那不作为的后果。特别地,C ++具有丰富的类型系统,其包括虚拟类成员。此功能如何应实行留给编译器作者和虚函数表分辨率的细节对函数签名有很大的影响。出于这个原因,C ++刻意暗示编译器作者做出名称重整是跨COM互不兼容pilers或与这些关键特征不同的实施方式相同的编译器。

这仅仅是一个较深的问题的症状,虽然高级语言,如C ++和C有详细的类型的系统中,较低级别的机器代码是完全无类型。随意丰富的类型系统是建立在机器级提供无类型的二进制的顶部。链接器没有获得提供给高级语言的丰富的类型信息。所述接头是完全依赖于编译器来处理所有类型的抽象的,并产生适当的类型的分类对象的代码。

C ++通过编码在错位的对象名称的所有必要的类型信息这一点。 C,然而,有显著不同的重点,目标是成为一种便携式汇编语言。 Ç喜欢从而有严格的一到声明的名称和所得到的对象的符号名之间的一一对应。如果C错位它的名字,甚至在一个标准化的和可预测的方式,你就必须去努力改变的名称匹配到所需的符号名称,否则你将不得不把它关掉,你在C做++。这些额外的努力来几乎没有任何好处,因为不像C ++,C的类型系统是相当小的,简单的。

与此同时,它实际上是一个标准的做法,以定义仅由他们采取作为参数的类型而变化的几个类似命名的C函数。为的只是这一个漫长的例子中,有一看 OpenGL的命名空间。

其他提示

在编译C源,符号名称将保持不变。如果你介绍函数重载,你应该提供一个名称重整技术,以防止名称冲突。因此,如C ++,你将有机生成的符号名在编译的二进制。

此外,C不设有严格类型。很多事情是隐式转换为彼此在C的的重载决策规则的复杂性可以在这种类型的语言引入混淆。

语言的设计者,包括我在内的很多,认为功能以C的隐式促销重载组合可能会导致代码,heinously难以理解。对于证据,看看知识的积累对C ++的身体。

在一般情况下,C99意欲是适度的修改与现有实践大体兼容。超载会是一个相当大的背离。

scroll top