|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Что означает extern "C" или extern "C++"?25.08.2017, 16:45. Показов 90110. Ответов 34
Метки нет (Все метки)
0
|
|
| 25.08.2017, 16:45 | |
|
Ответы с готовыми решениями:
34
что такое extern? Опишите функцию extern в Си, её аргументы, назначение и что возвращае Что значит #define AZAC_EXTERN_C extern "C" |
|
Любитель чаепитий
|
||||
| 25.08.2017, 20:10 | ||||
|
http://en.cppreference.com/w/c... ge_linkage
ссылку дать не могу, на этом форуме запрещено. можно нагуглить по запросу в гугле extern "C++".
0
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 25.08.2017, 20:18 [ТС] | |
|
GbaLog-,
Ну я о том же... По умолчанию языковое связывание и так C++, вот и не понятно зачем может понадобится писать это явно
0
|
|
|
|
||
| 25.08.2017, 20:46 | ||
|
Т.е. на пальцах всё сводится к наличию хидер-файла от библиотеки (или модуля), написанной на Си. Хидер файл стандартным образом обложен 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
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 25.08.2017, 21:42 [ТС] | |
|
Evg,
У них там что один в один компилятор запихнут код для компиляции си и плюсов? По идее это должны быть две разные ветки... Но... Это ж Майкрософт.... Добавлено через 22 секунды Спасибо что покопался =]
0
|
|
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
|
|
| 25.08.2017, 22:03 | |
|
0
|
|
|
Любитель чаепитий
|
||
| 26.08.2017, 09:50 | ||
extern "C++", ведь, если компилятор будет плюсовый, то эта функция по умолчанию будет объявлена с extern "C++".чего я недопонял?
1
|
||
|
|
|
| 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); } Кстати, вчера меня что-то смущало, но никак не мог понять что именно. Собственно, твой вопрос и показал пальцем на то, что это было
3
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 26.08.2017, 11:27 [ТС] | |
|
Evg,
А тебя не смущает то, что шаблон можно было просто положить за пределы extern "C" оставив проверку макроса на cplusplus? Тогда и extern c++ не понадобился бы, не?
0
|
|
|
Неэпический
|
||||||
| 26.08.2017, 12:06 | ||||||
|
Undisputed, когда функция одна - нормально будет, а когда несколько?
2
|
||||||
|
|
||
| 26.08.2017, 12:20 | ||
|
C MACRO_NAME (gets, char*, char) Через макрос (точнее, группу макросов) единообразно настраиваются все функции, чтобы проще было писать и сопровождать (хотя в конечном итоге такое почти всегда сложно читать) У меня нету компилятора MSVC, чтобы посмотреть всё в натуральном виде. Я описываю один из вариантов, как это могло бы быть реализовано, опираясь на ту статью, ссылку на которую помещать запрещено по правилам форума, а переписывать на форум нельзя, потому что нельзя копировать материалы, охраняемые авторским правом без указания первоисточника, что можно соблюсти только указав ссылку на первоисточник, которую помещать запрещено по правилам форума (а далее бесконечная рекурсия)
5
|
||
|
Модератор
|
|||||||
| 26.08.2017, 17:09 | |||||||
0
|
|||||||
| 26.08.2017, 17:09 | |
|
Помогаю со студенческими работами здесь
35
extern
директива extern
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
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
|