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

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

25.08.2017, 16:45. Показов 90110. Ответов 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
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
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,427
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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,157
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru