Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/483: Рейтинг темы: голосов - 483, средняя оценка - 4.84
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

Что означает extern "C" или extern "C++"?

25.08.2017, 16:45. Показов 90468. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например такой код, extern "C" void f();
Или C++ вместо C. Что это означает и где это применяется ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.08.2017, 16:45
Ответы с готовыми решениями:

что такое extern?
что будет если не написать extern,если можно с примерами

Опишите функцию extern в Си, её аргументы, назначение и что возвращае
Опишите пожалуйста функцию extern в Си, её аргументы, назначение и что возвращает. Не могу найти информацию((

Что значит #define AZAC_EXTERN_C extern "C"
Здравствуйте ,Когда я копался в одной из библиотек я нашел строчку кода #define AZAC_EXTERN_C extern "C" Как я помню...

34
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
25.08.2017, 16:58
В общем случае, extern означает, что функция, класс или переменная будет доступна по её имени для использования из другого компонента программы. Добавление "C" и "С++" указывает на то, в каком виде экспортировать имена объектов (в совместимом с языком Си или нет).
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.08.2017, 17:03
Разница только в том, с каким именем создастся метка в коде

Так:

C++
extern void qqq (void);
void foo (void)
{
  qqq ();
}
Code
$ g++ t.cc -S
$ cat t.s
...
        call    _Z3qqqv
...
или так:

C++
extern "C" void qqq (void);
void foo (void)
{
  qqq ();
}
Code
$ g++ t.cc -S
$ cat t.s
...
        call    qqq
...
Без этой конструкции ты не сможешь написать программу, исходники которой частично написаны на Си++, а частично на Си. Точнее всякими косыми-кривыми способами можно, но речь идёт о "нормальном" написании
4
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.08.2017, 17:54  [ТС]
Evg,
Почти ничего не понял
Какая разница как функция называется в ассемблере? Как это мешает выполняться коду который соответствует этой функции?

Всмысле написать программу исходники которой писаны на си и с++? Компилятор же при компиляции одновременно не использует два стандарта... Он либо компилит код по определённому стандарту си, либо с++(или не так?).
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
25.08.2017, 18:22
Undisputed, такая, что когда захочешь, например,
из dll вызвать функцию foo, обнаружишь,
что она называется impl@hodrhodr#@hdgst_foo,
а посему о хватишь оши ку undefined reference,
потому что манглинг имен в твоём компиляторе
работает не так как в том, в котором библиотека собиралась.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
25.08.2017, 18:29
Цитата Сообщение от Undisputed Посмотреть сообщение
Какая разница как функция называется в ассемблере? Как это мешает выполняться коду который соответствует этой функции?
Если реализация этой функции создавалась компилятором Си, то компоновщик C++ не найдёт эту функцию.
2
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.08.2017, 18:30  [ТС]
Croessmah,
То есть речь уже о скомпилированной библиотеки которая подключается в коде? (Прагмой вроде).

Т.е насколько я понял если мне хочется использовать функцию из сишной либы, я пишу extern "C" имя функции, далее плюсовый компилятор преобразует это имя функции в то как если бы мы компилировали сишный а не плюсовый код. Таким образом получится вызвать функцию из заранее скомпилированной сишный либы. И это весь смысл extern "C"?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
25.08.2017, 18:37
Цитата Сообщение от Undisputed Посмотреть сообщение
плюсовый компилятор преобразует это имя функции
С extern "C", как раз, не преобразует (как и Си-компилятор). Преобразование в С++ сделано, чтобы можно было использовать перегруженные функции (чего нет в Си).
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.08.2017, 18:46  [ТС]
nd2,
Вы меня ещё больше запутали если extern "C" не преобразует название функции в си-стиль, тогда что оно делает и зачем нужно?

Перегруженные функции и без extern ведь можно использовать...
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
25.08.2017, 18:57
Цитата Сообщение от Undisputed Посмотреть сообщение
Вы меня ещё больше запутали
Разве?
Цитата Сообщение от Undisputed Посмотреть сообщение
если extern "C" не преобразует название функции в си-стиль, тогда что оно делает и зачем нужно?
Чтобы компилятор С++ не преобразовывал название функции, и оно осталось бы таким же, как и в реализации, созданной компилятором Си. Иначе: встречает компилятор C++ прототип функции, без extern "C", void qqq (void), преобразует имя в _Z3qqqv, в месте вызова функции ставит метку Z3qqqv для того, чтобы компоновщик подключил здесь вызов реализации функции с этим именем, но если реализация этой функции было создана компилятором Си, то там она под именем qqq, и, в результате, компоновщик С++ не находит, что подключать.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.08.2017, 19:01
Цитата Сообщение от Undisputed Посмотреть сообщение
Какая разница как функция называется в ассемблере?
Примерно такая

C++
/* Файл t1.cpp */
extern void foo (void);
int main (void)
{
  foo();
  return 0;
}
C
/* Файл t2.c */
void foo (void)
{
}
Code
$ g++ t1.cpp -c
$ gcc t2.c -c
$ g++ t1.o t2.o
t1.o:t1.cc:(.text+0xc): undefined reference to `foo()'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1
А если напишешь extern "C", то проблем не будет
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.08.2017, 19:03  [ТС]
nd2,
А... Для сишных функций преобразования не требуется, а для плюсовых требуется. Поэтому extern "C" говорит плюсовому компилятору не коверкать имя функции(как эти делается в случае когда компилился сишный код). Понял, спасибо!

Только не попятно зачем тогда в с++ extern "C++" ведь оно и так по умолчанию будет делать преобразования. Или нет?
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.08.2017, 19:04  [ТС]
Evg,
Да, уже понял) Спасибо!
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
25.08.2017, 19:04
Цитата Сообщение от Undisputed Посмотреть сообщение
Только не попятно зачем тогда в с++ extern "C++" ведь оно и так по умолчанию будет делать преобразования. Или нет?
Теперь я не понял.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.08.2017, 19:07  [ТС]
nd2,
Ну видел примеры когда пишут extern "C++". Это зачем нужно, если у нас и так плюсовый компилятор и названия функций будут генериться по плюсовым соглашениям?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
25.08.2017, 19:09
Цитата Сообщение от Undisputed Посмотреть сообщение
Ну видел примеры когда пишут extern "C++". Это зачем нужно, если у нас и так плюсовый компилятор и названия функций будут генериться по плюсовым соглашениям?
Имеешь ввиду, когда при сборке С++ компилятором не используется ничего собранного Си компилятором?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.08.2017, 19:45  [ТС]
nd2,
Просто когда пишется в плюсовом коде extern "C++" void foo();
Не понимаю зачем это нужно...
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
25.08.2017, 19:54
https://stackoverflow.com/ques... e-extern-c
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.08.2017, 19:56  [ТС]
GbaLog-,
Так если в сишном файле есть плюсовый код то компилятор си его не скомпилит же...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.08.2017, 20:00
Ссылка из поста #18 описывает некую формальную сторону вопроса. Но я как-то не могу сообразить, в каких случаях реально такое может оказаться востребованным. Кроме каких-то синтетических надуманных случаев в голову ничего не приходит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.08.2017, 20:00
Помогаю со студенческими работами здесь

extern
Собственно как правильно пользоваться такой штукой? 1. Где нужно использовать: 1) только в заголовочном файле 2) только в исходном...

Extern в C/C++
Оговорка - собирал все под VS2015 и под него же с Clang'ом для убедительности. В первую очередь интересует актуальная для них информация,...

Extern template
Не могу понять, в книге пишут: Примерно понимаю, при компиляции будет добавлен код определения шаблона в каждый файл где он...

директива extern
Никак н могу понять как решить проблму с директивой extern. Я подключил к проекту файл libext.h и попытался скомпилировать программу. И...

extern class
Есть класс, мне нужно его указать в typedef до его описания. Можно ли объявить его через extern? extern class ANY; //error: a...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru