Совместима ли D с C, если вы используете библиотеки C?
Если я импортирую библиотеки std.c вместо включения библиотек в C, будет ли код C компилироваться с помощью компилятора D, или есть другие проблемы с совместимостью обратных слов?
3 ответа
В D есть несколько тонкостей, из-за которых код на C может вести себя не совсем так, как вы этого хотите. Например, правила целочисленного продвижения не совсем одинаковы (но почти), а правила инициализации различны (например, значения с плавающей запятой, включая массивы таких переменных, инициализируются в NaN). Кроме того, синтаксис указателя на функцию C недавно был объявлен устаревшим, поэтому вам, возможно, придется преобразовать некоторый синтаксис типа C в эквивалентный синтаксис D.
В целом, тем не менее, большое внимание уделяется обратной совместимости, и большая часть кода на C должна прекрасно компилироваться (или с очень небольшим количеством изменений) в D с той же семантикой, что и в C.
Также обратите внимание, что std.c
устарела; пожалуйста, используйте core.stdc
вместо.
Вы никогда не сможете взять файл C или C++ и скомпилировать как код D, и вы не можете просто #include
Заголовки C в D. D не имеют обратной совместимости ни с C, ни с C++. Скорее, можно объявить extern(C)
функции в вашем D-коде, и вызывайте эти функции C, как если бы они были функциями D (естественно, вам необходимо связать их с библиотекой C, в которой они определены). Увидеть
для получения подробной информации о вызове кода C из D.
У druntime (который содержит модули core.*) есть объявления для довольно многих стандартных функций C и OS (в модулях core.stdc.* и core.sys.*), но вам нужно взглянуть на druntime Сами файлы, чтобы увидеть, что они из себя представляют, потому что они не документированы должным образом Для любых других функций C, которые вы хотите вызывать, вы можете легко создавать для них объявления, как описано в ссылках выше.
Теперь C и D очень похожи синтаксически, поэтому некоторые разделы кода C будут компилироваться так же хорошо, как и код D, но программы в целом - нет. Общее правило состоит в том, что код C/C++ либо скомпилируется как действительный D-код с той же семантикой, либо не скомпилируется как D-код. Есть несколько случаев, когда это не так (например, статические массивы являются типами значений в D, в отличие от C/C++), но это почти во всех случаях. Это делает перенос кода C/C++ на D довольно простым, но никогда не предполагалось, что D будет обратно совместим с кодом C, как C++.
Ваш вопрос отличается от того, который вы задаете в ОП.
Q1: D обратно совместим с C, если вы используете библиотеки C?
A: Да. Вы можете использовать C библиотеки. Подробнее об этом здесь.
Q2: Будет ли код C компилироваться с помощью компилятора D?
A: Реализация компилятора D никогда не предполагала возможности компилировать код на Си. Тем не менее, большая часть кода на C будет компилироваться, потому что D соответствует типам данных компилятора C, схемам и последовательностям вызова / возврата функций. Как отметил Зор, синтаксис указателя на функцию в стиле C и синтаксис указателя массива в стиле C устарели.