|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Что означает extern "C" или extern "C++"?25.08.2017, 16:45. Показов 91095. Ответов 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,428
|
|
| 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
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
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.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|