Какова цель extern C AND С++ для одной функции (bsearch/qsort)?
При просмотре черновика стандарта (N4527) я нашел следующий абзац ([alg.c.library]):
Подпись функции:
bsearch(const void *, const void *, size_t, size_t,
int (*)(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*));
extern "C++" void* bsearch(const void* key, const void* base,
size_t nmemb, size_t size,
int (*compar)(const void*, const void*));
И тот же материал для qsort
.
Я также нашел в [dcl.link]:
Если два объявления объявляют функции с тем же именем и списком параметров (8.3.5), которые являются членами одного и того же пространства имен или объявляют объекты с тем же именем членами одного и того же пространства имен, а декларации дают имена различные языковые связи, программа плохо сформирована;
Какова цель этих двух extern
объявлений одной и той же функции? Почему этот блок не плохо сформирован?
Ответы
Ответ 1
Списки типов параметров не совпадают. В самом деле. Я не шучу. Два аргумента compar
имеют разные типы: в первом объявлении, поскольку функция extern "C"
, функция compar
также extern "C"
; во втором, функция compar
extern C++"
. И поэтому есть два объявления: чтобы вы могли называть bsearch
функциями с языковой связью.