Разница между внешним "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 есть связь С.

Другие вопросы по тегам