901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

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

25.08.2017, 16:45. Показов 91095. Ответов 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
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
25.08.2017, 20:10
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Undisputed Посмотреть сообщение
Так если в сишном файле есть плюсовый код то компилятор си его не скомпилит же...
это не для сишного компилятора, а для плюсового.
http://en.cppreference.com/w/c... ge_linkage
1) "C++", the default language linkage.
Цитата Сообщение от Evg Посмотреть сообщение
Но я как-то не могу сообразить, в каких случаях реально такое может оказаться востребованным.
я тоже, но нагуглил на русском стековерфлоу, что в MS где-то такое используется.
ссылку дать не могу, на этом форуме запрещено.
можно нагуглить по запросу в гугле extern "C++".
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.08.2017, 20:15
Цитата Сообщение от GbaLog- Посмотреть сообщение
в MS где-то такое используется.
...
можно нагуглить по запросу в гугле extern "C++"
А нэту Кинь ссылку в личку
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.08.2017, 20:18  [ТС]
GbaLog-,
Ну я о том же... По умолчанию языковое связывание и так C++, вот и не понятно зачем может понадобится писать это
явно
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.08.2017, 20:46
Цитата Сообщение от GbaLog- Посмотреть сообщение
я тоже, но нагуглил на русском стековерфлоу, что в MS где-то такое используется
Там используется читерский приём, чтобы вовнутрь Си'шного хидера просунуть Си++'ные описания. Т.е. действительно вовнутрь extern "C" есть необходимость вписать код extern "C++"

Т.е. на пальцах всё сводится к наличию хидер-файла от библиотеки (или модуля), написанной на Си. Хидер файл стандартным образом обложен extern "C", чтобы нормально работать при подключении в режиме C++. Но при этом в середину включается дополнительная читерская сопля

C
/* Как бы стандартный stdio.h, который имеет возможность подключения в Си++ */
 
#ifdef __cplusplus
extern "C" {
#endif
 
extern void func1 (void);
extern void func2 (void);
extern void func3 (void);
 
/* А вот это читерская сопля. Делается она ради того, что на Си++, например,
 * можно написать более надёжную реализацию через шаблоны. Под "надёжностью"
 * в данном понимается написание кода таким образом, чтобы код гарантированно
 * ломался в точке возникновения ошибки, а не где-то в другом месте
 *
 * Таким образом, например, реализуются всякие "надёжные" микрософтовская
 * решения типа scanf_s, gets_s. Здесь я опишу немного по-другому, просто чтобы
 * продемонстрировать суть. Я не знаю, как оно выглядит на самом деле, потому что
 * MSVC'ой не пользуюсь, просто на форуме видел много подобных тем. Возможно,
 * я здесь описал не так, как оно на самом деле в MSVC. Моих знаний Си++ не хватает,
 * чтобы быть уверенным, что с точки зрения синтаксиса я всё описал правильно.
 * Но, надеюсь, базовая суть ясна */
 
/* Это как бы стандартная функция Си */
extern char* gets (char *s);
 
/* А это шаблонная функция, которая при работе с массивом char'ов
 * заменит вызов "опасной" функции gets на "безопасную" gets_s. Будет включено
 * только в режиме Си++ */
#ifdef __cplusplus
extern "C++"
{
  template <size_t _Size>
  inline
  char* gets (char (&s)[_Size])
  {
     return gets_s (s, _Size);
  }
}
#endif
 
#ifdef __cplusplus
}
#endif
4
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
25.08.2017, 20:49
Присоединяясь к вопросу.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
25.08.2017, 21:42  [ТС]
Evg,
У них там что один в один компилятор запихнут код для компиляции си и плюсов?
По идее это должны быть две разные ветки...

Но... Это ж Майкрософт....

Добавлено через 22 секунды
Спасибо что покопался =]
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.08.2017, 21:53
Цитата Сообщение от Undisputed Посмотреть сообщение
По идее это должны быть две разные ветки...
Так там и так разные. Для Си и Си++ разведены макросом __cplusplus
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,428
25.08.2017, 22:03
Цитата Сообщение от Undisputed Посмотреть сообщение
Просто когда пишется в плюсовом коде extern "C++" void foo();
Дошло, я всё про extern "C"...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.08.2017, 22:06
Цитата Сообщение от Evg Посмотреть сообщение
Для Си и Си++ разведены макросом __cplusplus
На всякий случай, возможно не всем очевидно. В режиме Си++ компилятор взводит макрос __cplusplus, а в режиме Си - нет
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
26.08.2017, 09:50
Цитата Сообщение от Evg Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
#ifdef __cplusplus
extern "C++"
{
  template <size_t _Size>
  inline
  char* gets (char (&s)[_Size])
  {
     return gets_s (s, _Size);
  }
}
#endif
мне всё равно непонятно, зачем тут extern "C++", ведь, если компилятор будет плюсовый, то эта функция по умолчанию будет объявлена с extern "C++".
чего я недопонял?
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.08.2017, 10:16
Так ведь эта функция находится внутри блока extern "C". Поэтому там не будут работать шаблоны

Добавлено через 2 минуты
Получается, что extern "C" означает не только запрет на манглирование имён, но ещё и запрет (возможно, частичный) на использование того, чего нет в Си

Добавлено через 2 минуты
Так не работает:

C++
extern "C"
{
  template <class T>
  T foo (T t)
  {
    return t;
  }
}
 
int main (void)
{
  return foo(10);
}
Code
$ g++ t.cc -S
t.cc:4:3: ошибка: шаблон с привязкой C
   template <class T>
   ^
а так работает:

C++
extern "C"
{
  extern "C++"
  template <class T>
  T foo (T t)
  {
    return t;
  }
}
 
int main (void)
{
  return foo(10);
}
Добавлено через 1 минуту
Кстати, вчера меня что-то смущало, но никак не мог понять что именно. Собственно, твой вопрос и показал пальцем на то, что это было
3
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
26.08.2017, 11:27  [ТС]
Evg,
А тебя не смущает то, что шаблон можно было просто положить за пределы extern "C" оставив проверку макроса на cplusplus? Тогда и extern c++ не понадобился бы, не?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
26.08.2017, 12:06
Undisputed, когда функция одна - нормально будет, а когда несколько?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifdef __cplusplus
extern "C" {
#endif
   void foo1();
   void foo2();
   //если бы перегрузка была здесь, было бы удобнее
   void foo3();
   void foo4();
   //...
   void foo123();
#ifdef __cplusplus
}
#endif
 
#ifdef __cplusplus
//А тут ходи по файлу как дурак
  void foo2(int);
  void foo11(float);
  //...
#endif
Лучше вообще два разных заголовочника сделать.
2
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.08.2017, 12:20
Цитата Сообщение от Undisputed Посмотреть сообщение
А тебя не смущает то, что шаблон можно было просто положить за пределы extern "C" оставив проверку макроса на cplusplus?
Не смущает. Я здесь показал некий итоговый вариант. Тот код, что в виде extern "C++" попал в файл stdio.h, в реальности является следствием раскрытия макроса. Т.е. в реальности в stdio.h написано что-то типа:

C
MACRO_NAME (gets, char*, char)
Макрос MACRO_NAME разворачивается в описание функции и в режимах Си и Си++ он настраивается по разному. В том числе и с учётом макроса _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES, который запрещает/разрешает нанотехнологии с "безопасными" функциями

Через макрос (точнее, группу макросов) единообразно настраиваются все функции, чтобы проще было писать и сопровождать (хотя в конечном итоге такое почти всегда сложно читать)

У меня нету компилятора MSVC, чтобы посмотреть всё в натуральном виде. Я описываю один из вариантов, как это могло бы быть реализовано, опираясь на ту статью, ссылку на которую помещать запрещено по правилам форума, а переписывать на форум нельзя, потому что нельзя копировать материалы, охраняемые авторским правом без указания первоисточника, что можно соблюсти только указав ссылку на первоисточник, которую помещать запрещено по правилам форума (а далее бесконечная рекурсия)
5
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
26.08.2017, 17:09
Цитата Сообщение от GbaLog- Посмотреть сообщение
чего я недопонял?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifdef __cplusplus
extern "C" {
#endif
 
  ... очень, нет ОЧЕНЬ много кода
 
  ... вот тут вот страсть как хочется кусочек extern "C++" ...
 
  ... снова много кода
 
#ifdef __cplusplus
}
#endif
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.08.2017, 17:09
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru