Если я напишу файл 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 или .di, если вы переименуете его, но то же самое, и получите определение вашего интерфейса.
dmd main завершится ошибкой компоновщика, поэтому нам нужно реализовать его: http://arsdnet.net/dcode/impl.d Примечание: impl НЕ импортирует модуль, поэтому он никогда не проверяет другой файл. Синхронизация файлов .di и .d является одной из сложных частей здесь, если только вы не сгенерируете файл интерфейса автоматически, поскольку неопределенные методы дадут ошибки компоновщика, но порядок методов важен: он должен совпадать, и так должно быть. список переменных, если есть общедоступные. В противном случае код использования и код реализации не будут согласовываться с макетом класса.
Опять же, он не проверяет это автоматически, файл реализации вообще не смотрит на "заголовочный" файл, так что это большое отличие от C++, где вы пишете файл заголовка один раз, а затем используете это как в программе использования, так и в файле реализации.
Вы заметите, что в файле реализации также указан класс и т. д. D не поддерживает синтаксис void MyClass::add(int a) {}
C++ должен писать метод вне класса.
Насколько я знаю, нет способа заставить файл реализации искать заголовок, если поставить оба в командной строке, то получится: "Ошибка: модуль iface.test из файла iface/test.d конфликтует с другим модулем тест из файла impl.d"
Файлы .di рекомендуется использовать для автоматического создания с помощью dmd -H. Это считывает полный файл реализации и удаляет тела функций, оставляя только определения. Эта часть, вероятно, является ключевой, когда говорят, что это особенность компилятора - файл .di является допустимым и стандартным D, но генерируется с помощью опции компилятора, которая не обязательно должна быть частью других компиляторов.
person
Adam D. Ruppe
schedule
06.08.2013