Объявляет ли g ++ имя C Standard Library как внешнюю связь "C" или внешнюю "C ++"? - PullRequest
1 голос
/ 12 апреля 2019

Согласно ISO_14882_2014, раздел- [17.6.2],

Whether a name from the C standard library declared with external linkage has
extern "C" or extern "C++" linkage is implementation-defined. It is 
recommended that an implementation use extern "C++" linkage for this purpose.

Поскольку это поведение, определяемое реализацией, я просматриваю документ g ++, но ничего там нет.

Какая связь g ++ имеет для стандартных функций библиотеки C? Я проверил, искажается ли имя для какой-либо функции или нет .. И обнаружил, что это не так. Значит ли это, что g ++ имеет внешнюю связь "C"?

1 Ответ

2 голосов
/ 12 апреля 2019

Это будет зависеть от используемой вами стандартной библиотеки, а не от компилятора.

Как правило, с g++ вы будете использовать libstdc++, то есть библиотеку GNU C ++ (которая в свою очередь зависит от glibc, то есть библиотека GNU C).По умолчанию этот выглядит так, как будто он использует связь C для имен C.Если вы посмотрите на сами источники, вы в настоящее время увидите 4 различных набора заголовков C.

В любом случае вам не следует полагаться на это, и это также может измениться без предупреждениядаже между выпусками.

В идеале, если вам необходимо экспортированное имя по какой-либо причине (искаженное или нет), вы должны напрямую выбрать его из общего объекта или из заголовков, которые использует ваш компилятор, вместополагаясь на данную связь.

Сказав это, основные стандартные библиотеки / компиляторы предоставляют их как extern "C", даже MSVC в Windows;и даже если вы используете заголовки C ++ cname (конечно, в глобальном пространстве имен).

...