2014-01-31 4 views
4

Как известно, объявление функции extern "C" на C++ делает его имя C связным, позволяя связать C-код.Функциональность C++ 'extern-' C 'для языков, отличных от C

Мой вопрос: есть ли другие языки программирования, которые могут иметь имена функций C++, связаны с чем-то вроде extern "Lisp" или extern "FORTRAN"?

Если нет, то почему? Какова внутренняя структура позади "C", что делает ограничения?

Каковы альтернативы?

+0

Нет, потому что почти все остальное совместимо с C и его вызовами. –

+2

Существует также внешний паскаль ... – Almo

+1

«C» - единственная такая привязка *, требуемая стандартом C++ *, но компиляторы могут предоставить больше; поэтому это постоянная строка. extern «FORTRAN» будет иметь большой смысл для компиляторов, у которых есть как C++, так и FORTRAN. Я бы не ожидал увидеть extern «Lisp», хотя бы потому, что среда Lisp имеет тенденцию быть ее собственным монолитом. – zwol

ответ

2

Стандарт C++ 7.5.2 dcl.link, говорит:

Связь между C++ и не-C++ фрагментов кода может быть достигнуто с использованием тяг-спецификации:

linkage-specification: 
    extern string-literal { declaration-seqopt} 
    extern string-literal declaration 

string-literal указывает на требуемую языковую привязку. Этот Международный стандарт определяет семантику для строковых литералов «C» и «C++». Использование строкового литерала, отличного от «C» или «C++», является условно поддерживаемым, с семантикой, определенной реализацией. [Примечание: Следовательно, спецификация привязки со строковым литералом, который , неизвестный реализации, требует диагностики. -end note] [ Примечание: рекомендуется, чтобы написание строкового литерала было взято из документа, определяющего этот язык. Например, Ada (не ADA) и Fortran или FORTRAN, в зависимости от винтажа. -end note]

В принципе, разработчики могут выбрать поддержку других спецификаций связи, чем C и C++.

На практике, однако, на всех современных платформах C-связь является самым низким общим знаменателем. Как правило, в эти дни двоичный interop для языков, отличных от C, использует C-связь. На широко используемых современных платформах вы не увидите ничего, кроме связей C и C++.

+1

'extern" Pascal "существует (хотя это нестандартное расширение) - он используется для разграничения между различными соглашениями о передаче параметров между C и Pascal. –

+0

@PaulR Он не использовался в течение очень долгого времени (ни один из моих компиляторов не поддерживает его, я думаю), и никогда не буду мной. И я сделал много C/Pascal interop. В эти дни все компиляторы Pascal могут выполнять 'cdecl' и' stdcall'. –

+0

Rummaging Google показывает, что 'extern" FORTRAN "также существует. Однако я не мог найти ссылку, официально разрешив проблему - кто-нибудь есть? – Reflection

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

  • Нет связанных вопросов^_^