2017-07-15 5 views
15

標準(N4527)のドラフトを閲覧、私は、次の段落を発見した([alg.c.library]):単一の関数(bsearch/qsort)のextern C AND C++の目的は何ですか?

関数シグネチャ:

bsearch(const void *, const void *, size_t, size_t, 
    int (*)(const void *, const void *)); 

することによって置換されます2つの宣言:qsortため

extern "C" void* bsearch(const void* key, const void* base, 
         size_t nmemb, size_t size, 
         int (*compar)(const void*, const void*)); 
extern "C++" void* bsearch(const void* key, const void* base, 
          size_t nmemb, size_t size, 
          int (*compar)(const void*, const void*)); 

と同じもの。

Iはまた、[dcl.link]に見出される:2つの宣言が同じ名前空間のメンバーであるか、またはオブジェクトを宣言するために、同じ名前、パラメータ型リスト(8.3.5)を用いて関数を宣言した場合

同じ名前空間のメンバーであることと同じ名前で、宣言は異なる言語のリンケージに名前を付けます。プログラムは不正です。

これらの2つの目的は同じ機能を宣言したものですか?externなぜこのブロックは悪質なものではないのですか?

+0

どのスタンダードをターゲットにしていますか?私は['[extern.names]/4'](http://eel.is/c++draft/extern.names#4)を正しく理解していれば、それらの関数が「extern」と記されている。 – Rakete1111

+0

@ Rakete1111 N4527 – Holt

答えて

16

パラメータタイプリストは同じではありません。本当に。冗談じゃないよ。 2つのcompar引数の型は異なります。最初の宣言では、関数がextern "C"であるため、compar関数もextern "C"です。第2のものでは、comparの機能はextern C++"である。そのため、2つの宣言があります:bsearchには、言語リンケージを持つ関数を呼び出すことができます。

+0

ほとんどの実装が標準のこの部分に違反していることに注意してください。 –

+0

['cstdlib'の概要](http://eel.is/c++draft/cstdlib.syn)について言及する価値があります。最新の標準原案には、それを明確にするためにいくつかの有用なエイリアスがあります。 – StoryTeller

+0

リンケージ指定子が引数にも適用されることを意味しますか?実際には、これら2つの宣言をコンパイルすることはできません。これは@MarcGlisseのコメントに関連していますか? – Holt

関連する問題