Разница между внешним "C" и просто внешним
Я видел код C/C++, использующий extern "C", объявленный в сигнатурах функций, а также при включении заголовка C в файл CPP.
но некоторые функции просто объявляют extern перед своей подписью (без "C").
QN1:
оба эти способа определения функций имеют одинаковый эффект, или они подразумевают разные вещи?
извините, если я очень глупый, но я не могу найти эту разницу через Google.
Например:
extern int someFunction( void *ret_val);
extern "C" int someFunction( void *ret_val);
QN2:
если функция объявлена с extern в своей сигнатуре, необходимо ли включать соответствующий файл заголовка в блок extern "C"?
Как указал другой пользователь в комментариях, помеченный дубликат не в полной мере удовлетворяет данному вопросу. Я редактирую, чтобы в будущем другие не могли ввести в заблуждение другим вопросом.
3 ответа
extern "C" просто означает, что следующий блок кода может быть скомпилирован с использованием компилятора C или Cpp. Это делается, когда у вас есть смесь кода C/C++, и вам необходимо отслеживать специфические для языка функции. Более отвратительным образом связь C становится совместимой в присутствии компилятора Cpp.
Код может быть любым - от переменной / typedef до полного объявления функции / модуля.
Но если вы сделаете это:
extern char c; // same goes true for extern int foo()
это означает, что вы говорите: "Я использую char c, у которого есть объявление, внешнее для этого файла". Больше похоже на другой модуль где-то в пути поиска. Это неявно глобально. Во время выполнения, если c изменяется, изменение отражается везде. Это при условии, что ваши директивы компилятора, такие как -Iinclude_file_dirs -Ssource_file_dirs и т. Д., Предоставлены правильно (в GCC или g++). Используя мощную среду разработки, например Visual Studio 2010 или более позднюю, вы можете сделать это очень легко.
"extern" является ключевым словом связи. Вы можете комбинировать его с "C" для директив компоновки, специфичных для компилятора.
extern "C" отключает искажение имени. Это позволит вашему коду C++ вызывать функции из библиотеки, скомпилированной компилятором C
extern "C" int someFunction( void *ret_val);
сделаю someFunction
есть связь С.