Я знаком с ключевым словом extern, оно используется для объявления переменной, присутствующей в каком-то другом файле, но что означает следующий оператор?
extern "C" const IMAGE_DOS_HEADER __ImageBase;
Я знаком с ключевым словом extern, оно используется для объявления переменной, присутствующей в каком-то другом файле, но что означает следующий оператор?
extern "C" const IMAGE_DOS_HEADER __ImageBase;
Это означает, что не искажайте имя символа __ImageBase
, которое следует за extern "C"
. Короче говоря, это гарантирует, что вы можете использовать переменную в коде C ++.
extern "C"
укажите применяемую связь. Короче говоря, спецификация связывания.
Она сообщает компилятору C ++ применить связывание типа C к следующему символу.
Хорошее прочтение:
Использование extern для указания связи
Как смешивать C и C ++
extern "C"
действительно является конструкцией только для C ++, но это по-прежнему означает, что код C, который ссылается на модуль C ++, определяющий эту переменную, сможет ссылаться на него ... Таким образом, он фактически работает в обоих направлениях , C в C ++ и C ++ в C (раздел 32.6 FAQ, кажется, согласен :).
- person Frédéric Hamidi; 22.05.2012
extern "C"
, поэтому нужно заключить строки extern "C" {
и`} `в #ifdef
, чтобы компиляторы C не увидели их.
- person Alok Save; 22.05.2012
both ways
(но я не знаю, действительно ли я был яснее на этот раз :)
- person Frédéric Hamidi; 22.05.2012
Это означает, что глобальная переменная __ImageBase
использует связь C и ее имя должно быть искаженным с использованием правил для C вместо C ++.
РЕДАКТИРОВАТЬ: Так получилось, что Раймонд Чен недавно опубликовал статья, демонстрирующая, что мой исходный ответ был совершенно неправильным: extern "C"
не отключить искажение имен, это только изменяет правила, используемые для его выполнения. Имена C тоже могут быть искажены.
extern "C"
не может быть назначена указателю на функцию C ++.
- person James Kanze; 22.05.2012
IMAGE_DOS_HEADER
? Связывание языков обычно применяется только к типам функций (включая типы вложенных функций, такие как указатель на функцию). - person James Kanze   schedule 22.05.2012extern "C"
я даже не могу найти имя в объектном файле. Что я точно не понимаю.) - person James Kanze   schedule 23.05.2012