Хорошо, после примерно 8 часов копания в этом дерьме я определил, что действительно можно вызывать функции Си изначально.
ОДНАКО, также утверждается, что «было бы бессмысленно пытаться портировать на D или писать оболочки D для огромного множества доступных API C. Насколько проще просто вызывать их напрямую».
Да, я собираюсь позвонить Б.С. Вам НЕОБХОДИМО портировать на D. Разве это не считается портированием, когда вы переходите от макроподключенной предварительной обработки файла .h к. Это определенно нетривиально. Поэтому, по моему мнению, они намеренно упускают сложную часть и стараются, чтобы она выглядела лучше, чем есть на самом деле.
В случае, если кому-то интересно, если у вас есть C api, который вы хотели бы вызвать в своем D-коде:
перейдите к файлу заголовка и попытайтесь преобразовать его во что-то, что D может прочитать.
Затем просто скомпилируйте свой код, импортируйте новый файл .d и свяжите его с тем, с чем вы взаимодействуете.
Если вы все сделали правильно, это сработает, и у вас будет много утечек памяти.
По моему мнению, если вам не нужна вся библиотека, избавьте себя от головной боли и просто привяжите небольшую оболочку C к вашему D-коду. Вы берете только то, что вам нужно, и у вас есть дополнительное преимущество, заключающееся в возможности переименовывать вещи в любое, что вы хотите.
Существует несколько проектов, которые помогут автоматизировать процесс перевода заголовочных файлов.
dtoh только для windows и bcd, который находится на dsource. BCD также включает в себя привязки для проклятий! они перечислены только как альфа, но они, кажется, работают. Я пытаюсь вызвать их файл curses.d из моего файла main.d, и я получаю:
main.d:13: Error: cannot implicitly convert expression ("ype any character to see it in bold\x0a") of type string to char[]
main.d:15: Error: function aphrodite.curses.printw (char*,...) is not callable using argument types (char[])
main.d:15: Error: cannot implicitly convert expression (stuff) of type char[] to char*
main.d:20: Error: function aphrodite.curses.printw (char*,...) is not callable using argument types (string)
main.d:20: Error: cannot implicitly convert expression ("F1 Key pressed") of type string to char*
main.d:26: Error: function aphrodite.curses.printw (char*,...) is not callable using argument types (string)
main.d:26: Error: cannot implicitly convert expression ("The pressed key is ") of type string to char*
main.d:28: Error: function aphrodite.curses.printw (char*,...) is not callable using argument types (string,int)
main.d:28: Error: cannot implicitly convert expression ("%c") of type string to char*
поэтому моя проблема заключается в том, как C обрабатывает строки и как D обрабатывает строки. Они не совпадают, и мои чрезвычайно ограниченные знания C не говорят мне, как это исправить.
К счастью, для всей антидокументирующей информации о вызове функций на C имеется довольно много информации о том, как типы D преобразуются в типы C.
Я искренне надеюсь, что кто-то найдет это полезным где-то внизу.