C ++ мови зв'язку, крім C?


25

Мова C ++ дозволяє змішувати як C ++, так і C в одному вихідному файлі. Наприклад,

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

Чи є C ++ чи коли-небудь підтримував будь-які інші "мови зв'язку", крім C? наприклад extern "Pascal"абоextern "Haskell"


більшість часу обидві мови будуть робити їх extern "C"еквівалент, щоб взаємодіяти один з одним
храповик виродка

C ++ підтримує інші зв’язки, дозволяючи імлементаціям додавати свої типи зв’язків (§ 7.5), питання повинно бути "Чи існують реалізації чи існували реалізації" ;-)
johannes

2
extern "C"впливає лише на зв’язок, а не на синтаксис та семантику тексту всередині блоку. Іншими словами, це все ще C ++ всередині цього extern "C"блоку; назви символів просто не піддаються зміні. Дивіться stackoverflow.com/q/1041866/712605
Річард Хансен

Відповіді:


17

extern "C" може бути єдиним необхідним:

Кожна реалізація повинна передбачати підключення до функцій, написаних мовою програмування C, "C", а також зв'язок з функціями C ++, "C ++".

Однак за цією цитатою можуть існувати й інші:

Рядок-літерал вказує на необхідну зв’язок мови. Цей Міжнародний стандарт визначає семантику для рядкових літералів "C" і "C ++". Використання рядкового літералу, відмінного від "C" або "C ++", умовно підтримується, з семантикою, визначеною реалізацією. [Примітка: Отже, специфікація зв'язку з рядковим літералом, який невідомий для реалізації, потребує діагностики. - кінцева примітка] [Примітка. Рекомендується, щоб написання рядка-букваря було взято з документа, що визначає цю мову. Наприклад, Ada (не ADA) та Fortran або FORTRAN, залежно від урожаю. - кінцева примітка]


1
Звідки це цитується?
Павло

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

9

У багатьох (більшості) середовищах "зовнішній" C "є умовою сполучення за умовчанням для будь-якої мови в системі.

Отже, залежно від операційної системи та реалізації "іноземної" мови "зовнішній C" - це все, що потрібно для виклику програми на іншій складеній мові.


Навіть у середовищах, що не використовують зв'язок C (Pascal, тобто часто використовує інший порядок аргументів на стеці, і виклик повинен звільнити значення), вони мають C-сумісний режим
johannes

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

1
Однак можуть бути випадки, коли постачальник компілятора додає спеціальні типи посилань. Окрім сумісності з іншими мовами, це також може бути цікавим для сумісності з різним керуванням іменем C ++. Питання: чи хтось робив :)
johannes


-4
  • Ні! C ++ підтримує лише C як "мови зв'язку".

  • extern "C" {структурна панель {/ * ... * /}}

  • Синтаксис, як зазначено вище, означає, що не змінюється назва змінної, структури чи функції. Оскільки C ++ може змінити назву змінної, структури чи функції, щоб реалізувати перевантаження класу, простору імен та функцій.

  • Якщо цього не зробити, лінкер, можливо, не може з'ясувати об'єкт змінної, структура функції.

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


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