Знаю, что 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
Макрос дальше используется в 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"
Комментариев нет:
Отправить комментарий