Использование ключевого слова Extern

Я знаком с ключевым словом extern, оно используется для объявления переменной, присутствующей в каком-то другом файле, но что означает следующий оператор?

extern "C" const IMAGE_DOS_HEADER __ImageBase;

person user1232138    schedule 22.05.2012    source источник
comment
возможный дубликат В исходном коде C ++, каков эффект extern C?   -  person Bo Persson    schedule 22.05.2012
comment
Что это IMAGE_DOS_HEADER? Связывание языков обычно применяется только к типам функций (включая типы вложенных функций, такие как указатель на функцию).   -  person James Kanze    schedule 22.05.2012
comment
@James, имена глобальных переменных тоже искажены. Однако ваша точка зрения о том, что связывание оказывает дальнейшее влияние на функции, остается в силе.   -  person Frédéric Hamidi    schedule 22.05.2012
comment
@ FrédéricHamidi Mangling зависит от реализации; он может ничего не испортить, все или что-нибудь между ними. На практике большинство компиляторов для большинства языков испортили все; то, что традиционно отличает C ++, - это сложность схемы изменения (включая информацию о типах параметров) для функций. Традиционно C и C ++ изменяют имена переменных одинаковым образом. (Быстрая проверка компиляторов, которые у меня есть, показывает, что после extern "C" я даже не могу найти имя в объектном файле. Что я точно не понимаю.)   -  person James Kanze    schedule 23.05.2012


Ответы (2)


Это означает, что не искажайте имя символа __ImageBase, которое следует за extern "C". Короче говоря, это гарантирует, что вы можете использовать переменную в коде C ++.

extern "C" укажите применяемую связь. Короче говоря, спецификация связывания.
Она сообщает компилятору C ++ применить связывание типа C к следующему символу.

Хорошее прочтение:
Использование extern для указания связи
Как смешивать C и C ++

person Alok Save    schedule 22.05.2012
comment
Теперь удаленный комментарий был правильным, поскольку extern "C" действительно является конструкцией только для C ++, но это по-прежнему означает, что код C, который ссылается на модуль C ++, определяющий эту переменную, сможет ссылаться на него ... Таким образом, он фактически работает в обоих направлениях , C в C ++ и C ++ в C (раздел 32.6 FAQ, кажется, согласен :). - person Frédéric Hamidi; 22.05.2012
comment
@ FrédéricHamidi: Компилятор C не понимает конструкцию extern "C", поэтому нужно заключить строки extern "C" { и`} `в #ifdef, чтобы компиляторы C не увидели их. - person Alok Save; 22.05.2012
comment
Да, мы согласны с тем, что его нельзя использовать вне модулей C ++. Но он позволяет использовать декорированный символ, если он определен в модуле C, или позволяет модулям C использовать символ, если сам модуль C ++ определяет его. Это то, что я имел в виду под both ways (но я не знаю, действительно ли я был яснее на этот раз :) - person Frédéric Hamidi; 22.05.2012

Это означает, что глобальная переменная __ImageBase использует связь C и ее имя должно быть искаженным с использованием правил для C вместо C ++.

РЕДАКТИРОВАТЬ: Так получилось, что Раймонд Чен недавно опубликовал статья, демонстрирующая, что мой исходный ответ был совершенно неправильным: extern "C" не отключить искажение имен, это только изменяет правила, используемые для его выполнения. Имена C тоже могут быть искажены.

person Frédéric Hamidi    schedule 22.05.2012
comment
C-связывание включает в себя больше, чем просто искажение; например, аргументы могут передаваться по-другому. Кроме того, языковая связь является частью типа; функция со связью extern "C" не может быть назначена указателю на функцию C ++. - person James Kanze; 22.05.2012