22

2011年12月にリリースされたC標準の新しいバージョンであるC11に関するウィキペディアの記事を読んでいたところ、追加された機能の1つが「タイプジェネリック式」であることがわかりました。

_Genericキーワードを使用したタイプジェネリック式。たとえば、次のマクロcbrt(x)は、 x のタイプに応じて、 cbrtl (x)cbrt(x)、またはcbrtf(x )に変換されます。

#define cbrt(X) _Generic((X), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(X)

これは私にはかなり恐ろしいように見えます-とにかく言語を変更しようとしているのなら、C ++のように関数のオーバーロードを追加してみませんか?

4

1 に答える 1

28

Cには外部シンボル用の名前空間が1つあり、ODR(One Definition Rule)を適用してextern、2つの変換単位で同じ名前の2つのオブジェクトが同じ定義を持つ必要があります。

オーバーロードをサポートするCABIを作成することは可能ですが、Cの主な強みはABIの単純さです。ほとんどすべてのプラットフォームで、「the」ABIはC ABIであり、ソース言語に関係なく、実行において何らかの役割を果たします。シンボルにタイプ情報を含める必要がある場合、これは失われます。

TGE(ライブラリで使用される)は、名前マングリングの手動操作バージョンです。typedefそれは、宣言が数学集約型の内部ループの生成を制御できるようにするために必要な仕事をします(または、おそらく非常に遠い将来にそうするでしょう) 。C ++のような言語の機能が必要な人は、C++に移植する必要があります。

于 2012-01-11T16:12:57.610 に答える