|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Что означает extern "C" или extern "C++"?25.08.2017, 16:45. Показов 90468. Ответов 34
Метки нет (Все метки)
0
|
|
| 25.08.2017, 16:45 | |
|
Ответы с готовыми решениями:
34
что такое extern? Опишите функцию extern в Си, её аргументы, назначение и что возвращае Что значит #define AZAC_EXTERN_C extern "C" |
|
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
|
|
| 25.08.2017, 16:58 | |
|
В общем случае, extern означает, что функция, класс или переменная будет доступна по её имени для использования из другого компонента программы. Добавление "C" и "С++" указывает на то, в каком виде экспортировать имена объектов (в совместимом с языком Си или нет).
1
|
|
|
|
|
| 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
|
|
|
Неэпический
|
|
| 25.08.2017, 18:22 | |
|
Undisputed, такая, что когда захочешь, например,
из dll вызвать функцию foo, обнаружишь, что она называется impl@hodrhodr#@hdgst_foo,а посему о хватишь оши ку undefined reference, потому что манглинг имен в твоём компиляторе работает не так как в том, в котором библиотека собиралась.
1
|
|
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
|
||
| 25.08.2017, 18:29 | ||
|
2
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 25.08.2017, 18:30 [ТС] | |
|
Croessmah,
То есть речь уже о скомпилированной библиотеки которая подключается в коде? (Прагмой вроде). Т.е насколько я понял если мне хочется использовать функцию из сишной либы, я пишу extern "C" имя функции, далее плюсовый компилятор преобразует это имя функции в то как если бы мы компилировали сишный а не плюсовый код. Таким образом получится вызвать функцию из заранее скомпилированной сишный либы. И это весь смысл extern "C"?
0
|
|
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
|
||
| 25.08.2017, 18:37 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 25.08.2017, 18:46 [ТС] | |
|
nd2,
Вы меня ещё больше запутали если extern "C" не преобразует название функции в си-стиль, тогда что оно делает и зачем нужно?Перегруженные функции и без extern ведь можно использовать...
0
|
|
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
|
|||
| 25.08.2017, 18:57 | |||
|
1
|
|||
|
|
||
| 25.08.2017, 19:01 | ||
|
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
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
|
|
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
|
|
| 25.08.2017, 19:04 | |
|
1
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 25.08.2017, 19:07 [ТС] | |
|
nd2,
Ну видел примеры когда пишут extern "C++". Это зачем нужно, если у нас и так плюсовый компилятор и названия функций будут генериться по плюсовым соглашениям?
0
|
|
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
|
||
| 25.08.2017, 19:09 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 25.08.2017, 19:45 [ТС] | |
|
nd2,
Просто когда пишется в плюсовом коде extern "C++" void foo(); Не понимаю зачем это нужно...
0
|
|
|
Любитель чаепитий
|
|
| 25.08.2017, 19:54 | |
|
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 25.08.2017, 19:56 [ТС] | |
|
GbaLog-,
Так если в сишном файле есть плюсовый код то компилятор си его не скомпилит же...
0
|
|
|
|
|
| 25.08.2017, 20:00 | |
|
Ссылка из поста #18 описывает некую формальную сторону вопроса. Но я как-то не могу сообразить, в каких случаях реально такое может оказаться востребованным. Кроме каких-то синтетических надуманных случаев в голову ничего не приходит
0
|
|
| 25.08.2017, 20:00 | |
|
Помогаю со студенческими работами здесь
20
extern
директива extern
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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(), которая. . .
|