Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.69/103: Рейтинг темы: голосов - 103, средняя оценка - 4.69
734 / 339 / 70
Регистрация: 10.06.2014
Сообщений: 2,356
1

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

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

Например такой код, extern "C" void f();
Или C++ вместо C. Что это означает и где это применяется ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2017, 16:45
Ответы с готовыми решениями:

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло",...

Как принять код клавиши, а вписать саму клавишу? (Принимает "57", что означает "9")
Нужно избавиться от такой глупости: char ch = 0; if(ch=='1')mas=1; if(ch=='2')mas=2; ...

Что означает "Программа "[4872] laba!.exe: Машинный код" завершилась с кодом 3 (0x3)."?
при запуске кода компилятор пишет "Программа " laba!!!!!!.exe: Машинный код" завершилась с кодом 3...

Декларирование C++ кода в extern "C"
Как правильно декларировать C++ код в extern "C" ? чтобы подтянуть его через cpython...

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

Так:

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

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

Всмысле написать программу исходники которой писаны на си и с++? Компилятор же при компиляции одновременно не использует два стандарта... Он либо компилит код по определённому стандарту си, либо с++(или не так?).
0
Грамотный. Безпорно.
16787 / 9683 / 1869
Регистрация: 27.09.2012
Сообщений: 24,032
Записей в блоге: 2
25.08.2017, 18:22 5
Undisputed, такая, что когда захочешь, например,
из dll вызвать функцию foo, обнаружишь,
что она называется impl@hodrhodr#@hdgst_foo,
а посему о хватишь оши ку undefined reference,
потому что манглинг имен в твоём компиляторе
работает не так как в том, в котором библиотека собиралась.
1
nd2
3399 / 2781 / 1250
Регистрация: 29.01.2016
Сообщений: 9,423
25.08.2017, 18:29 6
Цитата Сообщение от Undisputed Посмотреть сообщение
Какая разница как функция называется в ассемблере? Как это мешает выполняться коду который соответствует этой функции?
Если реализация этой функции создавалась компилятором Си, то компоновщик C++ не найдёт эту функцию.
2
734 / 339 / 70
Регистрация: 10.06.2014
Сообщений: 2,356
25.08.2017, 18:30  [ТС] 7
Croessmah,
То есть речь уже о скомпилированной библиотеки которая подключается в коде? (Прагмой вроде).

Т.е насколько я понял если мне хочется использовать функцию из сишной либы, я пишу extern "C" имя функции, далее плюсовый компилятор преобразует это имя функции в то как если бы мы компилировали сишный а не плюсовый код. Таким образом получится вызвать функцию из заранее скомпилированной сишный либы. И это весь смысл extern "C"?
0
nd2
3399 / 2781 / 1250
Регистрация: 29.01.2016
Сообщений: 9,423
25.08.2017, 18:37 8
Цитата Сообщение от Undisputed Посмотреть сообщение
плюсовый компилятор преобразует это имя функции
С extern "C", как раз, не преобразует (как и Си-компилятор). Преобразование в С++ сделано, чтобы можно было использовать перегруженные функции (чего нет в Си).
0
734 / 339 / 70
Регистрация: 10.06.2014
Сообщений: 2,356
25.08.2017, 18:46  [ТС] 9
nd2,
Вы меня ещё больше запутали если extern "C" не преобразует название функции в си-стиль, тогда что оно делает и зачем нужно?

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

C++
/* Файл t1.cpp */
extern void foo (void);
int main (void)
{
  foo();
  return 0;
}
C
/* Файл t2.c */
void foo (void)
{
}
Код
$ 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
734 / 339 / 70
Регистрация: 10.06.2014
Сообщений: 2,356
25.08.2017, 19:03  [ТС] 12
nd2,
А... Для сишных функций преобразования не требуется, а для плюсовых требуется. Поэтому extern "C" говорит плюсовому компилятору не коверкать имя функции(как эти делается в случае когда компилился сишный код). Понял, спасибо!

Только не попятно зачем тогда в с++ extern "C++" ведь оно и так по умолчанию будет делать преобразования. Или нет?
1
734 / 339 / 70
Регистрация: 10.06.2014
Сообщений: 2,356
25.08.2017, 19:04  [ТС] 13
Evg,
Да, уже понял) Спасибо!
0
nd2
3399 / 2781 / 1250
Регистрация: 29.01.2016
Сообщений: 9,423
25.08.2017, 19:04 14
Цитата Сообщение от Undisputed Посмотреть сообщение
Только не попятно зачем тогда в с++ extern "C++" ведь оно и так по умолчанию будет делать преобразования. Или нет?
Теперь я не понял.
1
734 / 339 / 70
Регистрация: 10.06.2014
Сообщений: 2,356
25.08.2017, 19:07  [ТС] 15
nd2,
Ну видел примеры когда пишут extern "C++". Это зачем нужно, если у нас и так плюсовый компилятор и названия функций будут генериться по плюсовым соглашениям?
0
nd2
3399 / 2781 / 1250
Регистрация: 29.01.2016
Сообщений: 9,423
25.08.2017, 19:09 16
Цитата Сообщение от Undisputed Посмотреть сообщение
Ну видел примеры когда пишут extern "C++". Это зачем нужно, если у нас и так плюсовый компилятор и названия функций будут генериться по плюсовым соглашениям?
Имеешь ввиду, когда при сборке С++ компилятором не используется ничего собранного Си компилятором?
0
734 / 339 / 70
Регистрация: 10.06.2014
Сообщений: 2,356
25.08.2017, 19:45  [ТС] 17
nd2,
Просто когда пишется в плюсовом коде extern "C++" void foo();
Не понимаю зачем это нужно...
0
Любитель чаепитий
3460 / 1583 / 491
Регистрация: 24.08.2014
Сообщений: 5,483
Записей в блоге: 1
25.08.2017, 19:54 18
https://stackoverflow.com/ques... e-extern-c
0
734 / 339 / 70
Регистрация: 10.06.2014
Сообщений: 2,356
25.08.2017, 19:56  [ТС] 19
GbaLog-,
Так если в сишном файле есть плюсовый код то компилятор си его не скомпилит же...
0
Evg
Эксперт CАвтор FAQ
21121 / 8137 / 628
Регистрация: 30.03.2009
Сообщений: 22,455
Записей в блоге: 30
25.08.2017, 20:00 20
Ссылка из поста #18 описывает некую формальную сторону вопроса. Но я как-то не могу сообразить, в каких случаях реально такое может оказаться востребованным. Кроме каких-то синтетических надуманных случаев в голову ничего не приходит
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2017, 20:00

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

LNK4210 & extern "C"
Добрый вечер. Вопрос находится между АСМ и С/С++. На С написана ".lib", её содержание: ...

Программерский сленг: что означает "кастомный" и "кастить"?
что есть "кастомный" и "кастить" ?

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов), которые разделяются...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование)
Разработать программу с использованием наследования классов, реализующую классы: − воин;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.