7

どうやら (少なくとも によるとgcc -std=c99) C99 は関数のオーバーロードをサポートしていません。C でいくつかの新機能をサポートしない理由は通常、下位互換性のためですが、この場合、関数のオーバーロードによって下位互換性が損なわれるケースは 1 つも思いつきません。この基本機能を含めない理由は何ですか?

4

3 に答える 3

19

C ソースをコンパイルすると、シンボル名はそのまま残ります。関数のオーバーロードを導入する場合は、名前の競合を防ぐために名前マングリング手法を提供する必要があります。その結果、C++ と同様に、コンパイルされたバイナリにマシン生成のシンボル名が含まれます。

また、C には厳密な型指定がありません。C では、多くのことが暗黙のうちに相互に変換可能です。オーバーロードの解決規則が複雑であるため、この種の言語では混乱が生じる可能性があります。

于 2009-08-21T23:29:00.703 に答える
6

私を含む多くの言語設計者は、関数のオーバーロードと C の暗黙的なプロモーションを組み合わせると、非常に理解しにくいコードになる可能性があると考えています。証拠として、C++ について蓄積された一連の知識を参照してください。

一般に、C99 は、既存の慣行とほぼ互換性のある控えめな改訂を意図していました。過負荷はかなり大きな逸脱だったでしょう。

于 2009-08-24T01:14:51.900 に答える