Если я пишу D-файл, подобный этому: http://arsdnet.net/dcode/iface/test.d и вы компилируете с помощью dmd -c, вы увидите, что он идет без ошибок; это действительный файл D. Язык позволяет вам писать прототипы функций без реализаций.
Файл .di просто так, у него просто другое имя файла.
После этого main: http://arsdnet.net/dcode/main.d, если вы скомпилируете dmd main, он автоматически выполнит поиск iface/test.d, когда увидит «import iface.test;», найдите этот файл .d или, если вы его переименуете но то же самое, и получите определение интерфейса.
dmd main не работает с ошибкой компоновщика, поэтому нам нужно его реализовать: http://arsdnet.net/dcode/impl.d Примечание: имплант не импортирует модуль, поэтому он никогда не проверяет другой файл. Хранение файлов .di и .d в синхронизации является одной из сложных частей здесь, если вы не создаете автоматически файл интерфейса, поскольку неопределенные методы дадут ошибки компоновщика, но порядок методов важен: он должен соответствовать, и поэтому список переменных, если есть публичные. В противном случае код использования и код реализации не согласуются с макетом класса.
Опять же, не проверить, что файл реализации не просматривает файл заголовка вообще, так что это существенное отличие от C++, где вы пишете файл заголовка один раз, затем используйте его как в программе использования, так и в файле реализации.
Вы также заметите, что в файле реализации также указан класс и т. Д. D не поддерживает синтаксис void MyClass::add(int a) {}
. C++ должен написать метод вне класса.
Насколько я знаю, нет способа заставить файл реализации искать заголовок, если вы поместите оба в командной строке, вы получите: «Ошибка: модуль iface.test из файла iface/test.d конфликтует с другим модульным тестом из файла impl.d «
Рекомендуется использовать файлы .di, чтобы их генерировать с помощью dmd -H.Это считывает полный файл реализации и удаляет тела функций, оставляя только определения. Эта часть, вероятно, является ключевым моментом, когда они говорят, что это особенность компилятора - файл .di является допустимым и стандартным D, но сгенерирован с помощью опции компилятора, которая необязательно должна быть частью других компиляторов.
Подробнее о файлах интерфейса D. – DejanLekic
@DejanLekic Я вижу только файлы интерфейса D, указанные в разделах документации в компиляторах. Является ли это компилятором или компилятором или языком? EDIT: Blargh, немного почитайте их. Они не являются частью языка. Есть ли решение, что * IS * часть языка? – user
Файл интерфейса D просто использует другую часть того же языка D. (На самом деле компилятор dmd не заботится о том, является ли расширение .d или .di, все они работают одинаково.) –