Я конвертирую заголовочные файлы библиотеки C в модули D, и мне было интересно, как мне обращаться со строками C.
Используя DMD 1, это работает:
void f(char* s); // Definition for C library's function.
Но использование DMD 2 (которое я лично использую, но я бы хотел, чтобы модули работали для обеих) было постоянным, поэтому для получения одного и того же кода с использованием модулей для работы требуется
void f(const(char)* s); // Definition for C library's function.
Что мне делать? Просто используйте char*
и сделайте так, чтобы код клиента делал строки изменяемыми? Или изменить тип в зависимости от версии компилятора, компилирующего код? Если первое, что является лучшим способом сделать их изменчивыми? Я думал, что .dup сделает это, но у компилятора не было этого. Если последнее, как бы я это сделал? Я попробовал это:
version (D_Version2) {
alias const(char)* charptr;
} else {
alias char* charptr;
}
void f(charptr s);
Но, увы, версия DMD 2 не является допустимым кодом для DMD 1, и весь код в блоках версии должен быть допустимым кодом для компилятора кода, даже если код не будет включен в получившийся исполняемый файл. Поэтому в настоящее время код компилируется в обоих, но сначала нужно изменить псевдоним, который, как вы можете себе представить, не идеален.