Страницы

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

воскресенье, 8 декабря 2019 г.

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

#cpp #visual_cpp


Знаю, что 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.
    


Ответы

Ответ 1



Для связи с другими языками программирования в 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"

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

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