2015-01-20 4 views
3

Я видел код C/C++, используя extern «C», объявленный в сигнатурах функций, а также при включении заголовка C в файл CPP.разница между extern «C» и просто extern

, но некоторые функции просто объявляют extern перед своей подписью (без «C»).

QN1:

являются оба этих способа определения функции имеют тот же эффект, или же они подразумевают разные вещи?

извините, если я очень глуп, но я не могу найти эту разницу через Google.

Например:

extern int someFunction(void *ret_val); 

extern "C" int someFunction(void *ret_val); 

QN2:

если функция объявлена ​​с экстерном в своей подписи, является необходимым для соответствующего файла заголовка, которые будут включены внутри экстерном «C» блок?

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

+1

http://en.cppreference.com/w/cpp/language/language_linkage –

+1

Кажется, что ни один из ответов в «дублирующем» вопросе (и почти никто не задает этот вопрос) описывают, что делает «extern» без «C» (или как он отличается от «extren» C »). Вот [docs] (http://en.cppreference.com/w/cpp/language/storage_duration), и вот stackoveflow [faq] (http://stackoverflow.com/questions/1358400/what-is-external- linkage-and-internal-linkage-in-c) об этом. Тогда есть еще одно использование с [templates] (http://en.cppreference.com/w/cpp/language/class_template). – user2079303

+0

@ user2079303: если бы вы ответили на мой комментарий, я бы принял ваш ответ. Большое спасибо. –

ответ

1

extern «C» означает, что следующий блок кода может быть скомпилирован с использованием C или Cpp-компилятора. Это делается, когда у вас есть смесь кода C/C++, и вам нужно отслеживать специфические для языка функции. Чуть более уродливым способом, C-связь становится совместимой в присутствии компилятора Cpp.

Код может быть любым из переменной/typedef для полного объявления функции/модуля.

Но если вы сделаете это:

extern char c; // same goes true for extern int foo() 

это означает, что вы говорите «Я использую обугленного с, который имеет декларацию внешнюю по отношению к этому файлу». Больше похоже на другой модуль где-то на пути поиска. Это неявно глобально. Во время выполнения, если c изменения, это изменение отражается повсюду. Это обеспечивается тем, что ваши директивы компилятора, такие как -Iinclude_file_dirs -Ssource_file_dirs и т. Д., Предоставляются правильно (на GCC или g ++). Используя мощную среду IDE, такую ​​как Visual Studio 2010 или новее, вы можете сделать это очень легко.

"extern" - ключевое слово linkage. Вы можете комбинировать его с «C» для директив привязки для компилятора.

+0

@ ha963ar: Спасибо. Является ли утверждение «Это неявно глобальным, статическим» правильным? Я читал, что extern и static - это разные вещи в ссылках, размещенных пользователем в комментариях user2079303. –

+1

@MohamedIqzas Спасибо, что указали это. Он определенно неявный Глобальный (но не статический). Static означает, что область действия функции/переменной равна программе. Исправлен мой ответ сейчас :) – ha9u63ar

+0

«extern« C »означает, что следующий блок кода может быть скомпилирован либо с использованием C, либо с помощью компилятора Cpp». - это неверно. –

3
extern "C" int someFunction(void *ret_val); 

сделаю someFunction есть C linkage.

6

extern "C" отключает определение имени. Это позволит вашему коду C++ вызывать функции из библиотеки, скомпилированной компилятором C