Страницы

Поиск по вопросам

вторник, 16 октября 2018 г.

Что такое extern “C++”?

Знаю, что extern "C" используют для отключения декорирования имён, что часто применяется для экспортируемых функций.
А что делает extern "C++"?

Заголовочный файл corecrt.h содержит
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // // C++ Secure Overload Generation Macros // //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ #ifndef RC_INVOKED #if defined __cplusplus && _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES
#define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_0(_ReturnType, _FuncName, _DstType, _Dst) \ extern "C++" \ { \ template \ inline \ _ReturnType __CRTDECL _FuncName(_DstType (&_Dst)[_Size]) _CRT_SECURE_CPP_NOTHROW \ { \ return _FuncName(_Dst, _Size); \ } \ }
Макрос дальше используется в stdio.h
__DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_0( char*, gets_s, char, _Buffer)
для объявления функций с массивом фиксированного размера:

Компилятор Visual Studio 2015.


Ответ

Для связи с другими языками программирования в C++ введена спецификация, называемая linkage specification
Из стандарта C++ (7.5 Linkage specifications)
1 All function types, function names with external linkage, and variable names with external linkage have a language linkage. [ Note: Some of the properties associated with an entity with language linkage are specific to each implementation and are not described here. For example, a particular language linkage may be associated with a particular form of representing names of objects and functions with external linkage, or with a particular calling convention, etc. —end note ] The default language linkage of all function types, function names, and variable names is C++ language linkage. Two function types with different language linkages are distinct types even if they are otherwise identical.
Стандартом поддерживается два литерала, используемых для связи с другими языками. Это
extern "C++"
и
extern "C"
Другие литералы в этой спецификации могут поддерживаться самостоятельно реализациями компиляторов.
Например, могут в программе на языке C++ использоваться имена (например, функции) из языка программирования Fortran. В этом случае эти имена могут предваряться спецификацией
extern "FORTRAN"

Комментариев нет:

Отправить комментарий