Ссылки на библиотеки C из C ++: почему не всегда нужен extern? - PullRequest
0 голосов
/ 30 января 2019

Обычно, чтобы получить библиотеку C, работающую на C ++, вы должны включить ее в extern "C" { #include <clibrary.h> }.Многие библиотеки будут включать в свои файлы заголовков код, такой как #ifdef __cplusplus extern "C" { ..., чтобы сделать их более удобными для пользователя в коде C ++ (например, pthread.h).Иногда это не так.Например, stdio.h не имеет такого #ifdef, но я все еще могу скомпилировать и связать обычный #include <stdio.h> int main() {printf("Hello");} с помощью компилятора C ++, не заключая его в оператор extern "C".Почему это?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Обычно, чтобы получить библиотеку C, работающую на C ++, вы должны включить ее в extern "C" { #include <clibrary.h> }.

Только тогда, когда библиотека не была разработана с учетом совместимости с C ++.Но это хак.

Многие библиотеки будут включать в свои файлы заголовков код, такой как #ifdef __cplusplus extern "C" { ..., чтобы сделать их более удобными для пользователя в коде C ++ (например, pthread.h)

Да, хорошая библиотека сделает это.

В результате вам не нужно и не следует добавлять еще один extern "C" вокруг #include.

stdio.hпример заголовка, который будет делать это правильно (см. ниже).

Например, stdio.h не имеет такого #ifdef

Конечно, это так! Следуйте деньги след

почему не всегда внешнеНужен?

Итак, в заключение, вам нужно сделать это только самостоятельно, если автор файла заголовка не сделал этого за вас.Когда автор файла заголовка сделал это, вам не нужно это делать.

0 голосов
/ 30 января 2019

Например, stdio.h не имеет такого # ifdef

Возможно, так и есть.В любом случае, <stdio.h> - это заголовок, предоставляемый стандартной библиотекой C ++ (унаследованный от стандартной библиотеки C).Он гарантированно работает без extern "C", как и все стандартные заголовки.

Обратите внимание, что использование <name.h> имени унаследованных стандартных заголовков в C ++ вместо <cname> не рекомендуется в текущей редакциистандарт и был определен как кандидат на удаление в будущих версиях.

почему не всегда нужен extern?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...