Языки связывания C ++, кроме C?


25

Язык C ++ позволяет смешивать как C ++, так и C в одном исходном файле. Например,

extern "C" {
    struct bar { /* ... */ }
}

Поддерживает ли C ++ или когда-либо поддерживал какие-либо другие «языки связей», кроме C? например extern "Pascal"илиextern "Haskell"


Большую часть времени оба языка будут делать то же extern "C"самое, что и взаимодействовать друг с другом
чокнутый урод

C ++ поддерживает другие связи, позволяя элементам добавлять их типы связей (§7.5), вопрос должен звучать так: «Существуют ли реализации или существуют реализации» ;-)
Йоханнес

2
extern "C"влияет только на связь, а не на синтаксис и семантику текста внутри блока. Другими словами, это все еще C ++ внутри этого extern "C"блока; имена символов просто не искажены. См. Stackoverflow.com/q/1041866/712605
Ричард Хансен

Ответы:


17

extern "C" может быть единственным обязательным:

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

Однако другие могут существовать согласно этой цитате:

Строковый литерал указывает на необходимую языковую связь. Этот международный стандарт определяет семантику строковых литералов "C" и "C ++". Использование строкового литерала, отличного от «C» или «C ++», поддерживается условно с определенной семантикой реализации. [Примечание: Следовательно, спецификация связи со строковым литералом, который неизвестен реализации, требует диагностики. - примечание конца] [Примечание: рекомендуется, чтобы написание строкового литерала было взято из документа, определяющего этот язык. Например, Ада (не АДА) и Фортран или Фортран, в зависимости от винтажа. - конец примечания]


1
Откуда это цитируется?
Пол

@paul c ++ 11 стандартный черновик
aaronman

9

Во многих (большинстве) средах "extern" C "является соглашением о связывании по умолчанию для любого языка в системе.

Поэтому в зависимости от операционной системы и реализации «иностранного» языка «extern C» - это все, что вам нужно для вызова программы на другом скомпилированном языке.


Даже в средах, не использующих связь C (Pascal, т. Е. Часто использующий другой порядок аргументов в стеке, и вызываемый должен освобождать значение), они имеют режим, совместимый с C
johannes

@johannes: На самом деле Windows использует соглашение Pascal для многих вещей, но так как это необходимо и в C, а в C нет extern "Language"синтаксиса " ", они делают это через расширение C для конкретной платформы, поэтому для C ++ это все еще справедливо extern "C"и особенное Ключевое слово определяет другое соглашение о вызовах.
Ян Худек

1
Тем не менее, могут быть случаи, когда поставщик компилятора добавляет специальные типы связей. Помимо возможности взаимодействия с другими языками, это также может быть интересно для возможности взаимодействия с различными названиями C ++. Вопрос, сделал ли кто-нибудь :)
Иоганнес


-4
  • Нет! C ++ поддерживает только C как «языки связи».

  • extern "C" {struct bar {/ * ... * /}}

  • Синтаксис, приведенный выше, означает, что не следует изменять имя переменной, структуры или функции. Потому что C ++ может изменить имя переменной, структуры или функции для реализации перегрузки класса, пространства имен и функции.

  • Если вы этого не сделаете, компоновщик может не найти объект переменной, структуру функции.

  • C ++ разработан для совместимости с C. Внешний "C" - это способ реализации совместимого с C.


10
Пожалуйста, проверьте §7.5 стандарта C ++. extern "C"и extern "C++"являются единственными обязательными, но реализации могут предоставлять другие.
Иоганнес
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.