Спецификации языковой привязки предназначены для включения ссылок в одни и те же файлы программных объектов, происходящих из разных исходных языков.
Проблема в том, что имена объектов (функций, переменных и т. Д.) В объектных файлах в точности не совпадают с именами соответствующих объектов в исходном коде.
C, являющийся старым и «простым» языком, не касался таких соображений и использовал имена источников в объектных файлах как есть.
C++, построенный сверху C, вводит функцию перегрузки, позволяя использовать разные функции с тем же именем. Поэтому сигнатура функций C++ должна быть закодирована в имени символа, представляющем эту функцию в объектном файле.
Кроме того, имена сущностей C++ может содержать следующие символы (которые не могли появиться в идентификаторах C):
:
- в полных имен (std::cout
)
<
, >
- в названиях специализированных специализаций
+
, -
, *
, /
и другие специальные символы - в названиях перегруженных операторов
достаточно Возможно, старые линкеры бы плохо уживаются с такими символами в именах символов, поэтому в C++ компиляторам пришлось кодировать эти символы с помощью безопасного подмножества.
Non-функциональные объекты в C++ (а именно - пространство имен переменных, статические элементы данных не-шаблон и шаблон классов) могут иметь символы :
, <
и >
в их названиях. Поэтому, если мы рассматриваем только C и C++, переменные также должны иметь языковые связи. Однако, если полное имя переменной C++ (без включения главного префикса глобального пространства имен) не содержит указанных символов, то его имя символа совпадает с его именем источника. В результате я не могу придумать случай, когда указание связи «C» для переменной имеет значение.
В принципе, спецификация языковых связей позволяет импортировать имена из модулей, скомпилированных с других языков программирования (хотя, как указано в вашей цитате, они определены по реализации). Если вы когда-либо необходимо связать с таким модулем иностранного языка и относятся к «глобальной» переменной в нем, вы должны сначала объявить его в исходном файле с помощью спецификации языка навески:
extern "Sci++" {
MemAllocFuncPtr Solver##Config##Malloc;
// Won't the '#' chararcters in the identifier name confuse the C++ compiler?
// Maybe C++ will need to be enhanced as below:
using SciPPSolverConfigMalloc = Solver##Config##Malloc;
}
Тем не менее, я не Не верю, что на практике вы столкнетесь с чем-либо подобным.
Вы спрашиваете, неверна ли цитата из книги? – davmac
Я слишком ленив, чтобы пойти на стандарты-дайвинг, чтобы дать правильный ответ, но, полагая, что книга правильная и ее можно поддерживать со стандарта, я вполне уверен, что вы не увидите примеров языковой привязки для объектов, заключается в том, что реализациям на самом деле не нужно использовать разные имена или другие подробности компоновщика для связей C и C++, поэтому на практике языковая связь не имеет никакого отношения к объектам. –