Недавно мне было интересно когда использовать C в C++ и наоборот? К счастью, кто-то уже меня опередил](https://softwareengineering.stackexchange.com/questions/113295/when-to-use-c-over-c-and-c-over-c) и хотя это заняло некоторое время, я смогла переварить все ответы и комментарии на этот вопрос.
Однако одна деталь в том, что пост держит, рассматривается снова и снова, без какой-либо пример, проверки или объяснения:
"и C код подходит, если вы хотите иметь несколько языковых Привязок для вашей библиотеки и"
Что'ы парафраз. Отмечу, что некоторые люди отмечают, что несколько языковых Привязок можно в C++ (через некоторые Экстерн
функционирования), но тем не менее, если Вы читаете этот пост полностью, он'ы довольно очевидно, что c идеально подходит для портативности/язык обязательный. Мой вопрос: почему?
Может кто-то просьба представить конкретные причины того, почему писать библиотеки на C облегчает Привязок и/или переносимость на другие языки?
С имеет гораздо более простой интерфейс, и ее правила для преобразования интерфейса исходного кода в двоичный интерфейс достаточно прост, что генерирующие внешние интерфейсы для привязки осуществляется в установленном порядке. В C++, с другой стороны, имеет невероятно сложный интерфейс, и правила Аби обязательными не являются стандартными на всех, ни официально, ни на практике. Это означает, что почти любой компилятор на любом языке для любой платформы можно привязать против внешнего интерфейса и точно знать, чего ожидать, но для C++ интерфейс, это'ы по существу невозможно, потому что правила меняются в зависимости от того, какой компилятор, какая версия и какая платформа на C++ код был создан.
В С, там's нет стандартный двоичный язык реализации правил, , но это'ы на порядок проще и на практике компиляторы используют те же правила. Еще одной причиной изготовления C++ код отладка вышеуказанных сложная грамматика, так как отладчики часто может'т бороться со многими языковыми особенностями (место останова В шаблоны, разобрать указатель команд литье в отображение данных Windows, и т. д.).
отсутствие стандартной Аби (двоичный интерфейс приложений) еще следствие - это делает доставку интерфейсы C++ с другими командами / клиентам не удобно, т. к. пользователь код выиграл'т работу, если она'ы скомпилирован с помощью тех же инструментов и опций. Мы've уже видел другой источник этой проблемы - нестабильность двоичные интерфейсы из-за отсутствия компиляции капсулирование время.
Если вы'вновь пытается общаться с оратора на другом языке, пиджин легче, чем шекспировский английский.
С'концепции s - функции, указатели, null-завершенной строки - очень проста, поэтому других языках, могут легко реализовать их достаточно хорошо для вызова C-функции. По историческим причинам, многие другие языки реализованы на языке C, что делает вызов функции C еще проще.
C++ добавляет совсем немного вещей - классы, с наследованием и vtables и модификаторы доступа; исключения из стека и изменения потока управления; шаблоны. Все это делает его более трудным для других языков, чтобы использовать C++ Привязок: в лучшем случае, там'ы более "клей" или совместимость кода для реализации, а в худшем, концепции, Дон'т переводить напрямую (из-за разницы в классе моделей, обработки исключений и т. д.). Для шаблонов, в частности, просто используя (создания) им обычно требуется этап компиляции с компилятором C++, который vastly затрудняет их использование в других средах.
Со всем этим сказал, Это'можно преувеличить трудность обеспечения привязки из библиотеки C++ на другой язык:
Экстерн "и с"
в, так что вы можете экспортировать в стиле C привязки к языку (при всей простоте и совместимости с креплениями) из библиотеки C++ (с тем ограничением, что вы можете'т подвергайте любой c++-специфичные функции).C является одним из старейших языков по-прежнему вокруг. Его Аби проста, и практически каждая операционная система по-прежнему используется сегодня, была написана в это*. Хотя некоторые из этих ОС's может добавили материал, например, в C#/.Net или как там по-верху, внизу они'вновь очень сильно погружен в с.
Это значит, что для того, чтобы использовать функциональные возможности, предоставляемые операционной системой, практически каждый язык программирования нужен способ взаимодействия с вообще библиотек. На Perl, Java, С++, они все изначально обеспечить способы, чтобы "поговорить с" и то, что они вынуждены, если они не'т хотим, чтобы изобретать каждым колесом есть.
Это делает c латинского языков программирования. (Сколько лет в интернете до того, что метафора должна быть "английский язык progamming-то"?)
Когда вы пишете свою библиотеку в C, вы получаете c-совместимый интерфейс бесплатно (очевидно). Если вы пишете библиотеку в C++, вы можете сделать привязку С, через Экстерн "и с"
в декларациях, как вы упомянули.
** Однако, вы можете получить эти привязки только по возможности что может быть выражено в C.
Так что ваша библиотека API не может воспользоваться...
Один простой пример, вам нужно сделать свой экспортируемых функций взять и возвращения массивы ([]
) вместо СТД::вектор
(или СТД::строка
если на то пошло).
Таким образом, не только будет вы быть в состоянии обеспечить любой из хороших вещей в C++, чтобы предложить к вашей библиотеке's для клиентов, вы также должны идти на дополнительно усилия, чтобы "перевести" по вашей библиотеки API из C++, чтобы "c совместимая с" (Экстерн "и с"
в).
Именно поэтому пункт может быть сделано, что C является лучшим выбором для реализации библиотеки. Лично я думаю, что преимущества C++ все еще перевешивают необходимые усилия для Экстерн "и с"
в API, но это's только мне.
Опуская подробности и другие ответы уже обеспечивают:
Почему так много языков представлен c обязательным является то, что все *операционные системы Nix и Windows предоставляют большинство своих ОС API с помощью интерфейса c. Таким образом, реализация языка уже должен взаимодействовать с C, чтобы иметь возможность работать на крупных ОС. Таким образом, нетрудно также предлагаем напрямую общаясь с любым интерфейсом C от самого языка.
Нет никаких причин. Если семантика вы'вновь пытается выразить в корне c-совместимая и не что-то вроде шаблонов, нет никаких причин, можно связать проще, если реализация написана на языке C. В самом деле, это'ы довольно много по определению, что с интерфейсом может быть заполнена любая реализация, которая может удовлетворить бинарного контракта, в том числе реализация на другом языке. Есть другие языки, кроме C++, который можно реализовать с бинарными контрактами, которые могут работать в таком режиме.
Что это действительно сводится к тому, людей, которые Дон'т хотите, чтобы узнать новые языки или идеи, которые на самом деле имеют полезные семантики или функции отчаянно пытаясь подобрать какой-либо причине, оставаться в эпоху динозавров.
Существует два основных осей при взаимодействии с другой язык:
C имеет преимущество по сравнению с C++ на двух фронтах:
Теперь, почему большинство языков имеют схожий набор понятий, чем C может быть из-за него либо на "простой" или "существующие" Ну; это не важно, суть в том, что они делают.
Напротив, C++ имеет сложные понятия, и Аби решает каждый компилятор (хотя многие придерживаются Itanimum Аби, кроме Windows...). Там на самом деле было предложение Херб Саттер, чтобы исправить операционки на C++ Аби (на уровне OS), чтобы частично решить эту проблему. Кроме того, следует отметить, что в C++ ИФО, возможно, D-это попытка<суп>3</SUP-серфинг>.
<суп>1</SUP-серфинг> Кроме в (...
), это не просто
<суп>2</суп> а Си имеют стандартный Аби?
<суп>3</суп> [сопряжение D на наследство кода C++] (
Принципиально все сводится к стандартизации Аби. Хотя ни c, ни c++ имеет стандартизированный аби, что другие языки могут использовать для связи между исполняемыми файлами написано, С стала стандартом де-факто, все это знают, и все еще можете использовать те же, простые, правила, что язык в отношении к типам и вызовы функций.
C++ может иметь стандартную Аби, но Страуструп сказал, что он не'т вижу необходимости. Он также сказал, что будет трудно добиться консенсуса от компилятора писателей (хотя я сомневаюсь, что стандарт C++ комитет будет выдавать Аби похожие на уже существующие и компилятор писатели просто изменят в следующей версии своих компиляторов, которые иногда несовместимы с существенного старые версии своих компиляторов все равно - я помню перекомпиляции пару библиотек с нового солнца компилятора и найти они не смогли работать со старыми)
Вы'обратите внимание, что некоторые компании перешли на использование стандартной Аби, Microsoft начал этот процесс с COM-еще в 90-х годах, и сегодня они'вэ уточнил это в WinRT, так аби (не путать с другими в WinRT, который относится к типу таблицы ОС), что позволяет программам, написанным на C# для взаимодействия с библиотеками, написанными на C или C++ (IE от Microsoft'собственная ОС слой написан на C++, выставлены используя WinRT и потребляемой приложений на языке C#, когда они называют любой операционной системы во время выполнения рутинных)
Там's не много любой может сделать, если тело норм действия и исправляет эту ситуацию. Microsoft, очевидно, не видит смысла в этом и предпринимает шаги, чтобы решить это за их платформу.
Так что ответ действительно с не'т обеспечение привязки к языку. Случается, что никто не слушал и потребляет их независимо.
Все ответы не соответствуют реальной проблемой: в C++ компиляция вводит "имя-коверкание-то", так что двоичные файлы не совместимы с "простой" и вызовов функций.
Все аби вещи-это не более чем попытка стандартизировать ее.
В общем, это's не гарантировано вы можете перекрестных ссылок, функции, скомпилированные с разными компиляторами, даже если вы будете придерживаться простой c++. Раньше это было обязательно они были несовместимы, но в наше время стандартизации-вползает ;)
Ото C был разработан именно для того, чтобы быть "у высокого собрания, что" и разрешить все вроде простое подключение. Это не должно удивлять это'ы лучше подходят для кросс-языковой вкус.
Примечание: оригинальный компилятор C++ (эта) на самом деле производится с источника, который должен быть скомпилирован, так же, как и gcc производит монтаж "под капотом" по.