2017-07-15 14 views
15

Kiedy przeglądając projekt standardu (N4527), znalazłem następujący akapit ([alg.c.library]):Jaki jest cel extern C i C++ dla pojedynczej funkcji (bsearch/qsort)?

Funkcja Podpis:

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

otrzymuje dwie deklaracje:

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 ten sam materiał dla qsort.

ja również znaleźć w [dcl.link]:

Jeśli dwie deklaracje zadeklarować funkcje o tej samej nazwie i-parametru typu listy (8.3.5) być członkami tej samej przestrzeni nazw lub zadeklarować przedmioty z tą samą nazwą, aby być członkami tej samej przestrzeni nazw, a deklaracje nadawały nazwom różne powiązania językowe, program jest źle sformułowany;

Jaki jest cel tych dwóch deklaracji extern o tej samej funkcji? Dlaczego ten blok nie jest źle sformułowany?

+0

Który standard wybierasz? Wydaje się, że się zmieniło, ponieważ jeśli dobrze rozumiem ['[extern.names]/4'] (http://eel.is/c++draft/extern.names#4), jest to definicja zdefiniowana, jeśli te funkcje są oznaczone "extern". – Rakete1111

+0

@ Rakete1111 N4527 – Holt

Odpowiedz

16

Listy typów parametrów nie są takie same. Naprawdę. Nie żartuję. Dwa argumenty compar mają różne typy: w pierwszej deklaracji, ponieważ funkcja jest extern "C", funkcja jest również extern "C"; w drugiej funkcji jest extern C++". I dlatego istnieją dwie deklaracje: aby można było zadzwonić pod numer bsearch z funkcjami z powiązaniami językowymi.

+0

Należy pamiętać, że większość implementacji narusza tę część standardu. –

+0

Warto wspomnieć o streszczeniu ['cstdlib'] (http://eel.is/c++draft/cstdlib.syn). Najnowsza wersja standardowa zawiera przydatne aliasy, dzięki którym staje się bardziej przejrzysta. – StoryTeller

+0

Masz na myśli specyfikator powiązań również dotyczy argumentów? Właściwie nie mogę uzyskać tych 2 deklaracji do skompilowania, czy jest to związane z komentarzem @MarcGlisse? – Holt

Powiązane problemy