2016-06-21 3 views
0

В Lischner's C++ in a Nutshell 2002Связана ли языковая связь только с функцией?

Каждая функция, типа функции, и объект имеет связь, язык, который указан в виде простой строки символов. По умолчанию связь - «C++». Единственная другая стандартная языковая связь - «C». Все ссылки связаны между собой, а свойства, связанные с различными языковыми связями , определяются реализацией.

Связана ли языковая связь только с функцией, а не с функциональным объектом? Примеры, которые я видел, похоже, да. Но, наверное, я что-то упустил.

Что означает эта цитата для каждого типа функций и объекта, имеющих языковые связи?

Спасибо.

+0

Вы спрашиваете, неверна ли цитата из книги? – davmac

+2

Я слишком ленив, чтобы пойти на стандарты-дайвинг, чтобы дать правильный ответ, но, полагая, что книга правильная и ее можно поддерживать со стандарта, я вполне уверен, что вы не увидите примеров языковой привязки для объектов, заключается в том, что реализациям на самом деле не нужно использовать разные имена или другие подробности компоновщика для связей C и C++, поэтому на практике языковая связь не имеет никакого отношения к объектам. –

ответ

0

Нет, переменные могут иметь языковые связи.

Прежде всего, ваша книга пересказывает стандарт:

Всех типов функций, имена функций с внешним связыванием, и именами переменных с внешним связыванием имеет языковую связь.

Это само по себе предполагает, что вы можете применять спецификации привязки к переменным.

Дальше есть этот пример:

extern "C" int i; // declaration 
extern "C" { 
    int i; // definition 
} 

Это показывает, как вы можете применить тяги спецификатор к не-функции. Кроме того, имеется несколько упоминаний о функциях и переменные через все [dcl.link] глава стандарта.

0

Спецификации языковой привязки предназначены для включения ссылок в одни и те же файлы программных объектов, происходящих из разных исходных языков.

Проблема в том, что имена объектов (функций, переменных и т. Д.) В объектных файлах в точности не совпадают с именами соответствующих объектов в исходном коде.

C, являющийся старым и «простым» языком, не касался таких соображений и использовал имена источников в объектных файлах как есть.

C++, построенный сверху C, вводит функцию перегрузки, позволяя использовать разные функции с тем же именем. Поэтому сигнатура функций C++ должна быть закодирована в имени символа, представляющем эту функцию в объектном файле.

Кроме того, имена сущностей C++ может содержать следующие символы (которые не могли появиться в идентификаторах C):

  1. : - в полных имен (std::cout)
  2. <, > - в названиях специализированных специализаций
  3. +, -, *, / и другие специальные символы - в названиях перегруженных операторов

достаточно Возможно, старые линкеры бы плохо уживаются с такими символами в именах символов, поэтому в 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; 
} 

Тем не менее, я не Не верю, что на практике вы столкнетесь с чем-либо подобным.

Смежные вопросы