Как мне обращаться с C-струнами в D? - PullRequest
4 голосов
/ 22 августа 2009

Я конвертирую заголовочные файлы библиотеки 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, и весь код в блоках версии должен быть допустимым кодом для компилятора кода, даже если код не будет включен в получившийся исполняемый файл. Поэтому в настоящее время код компилируется в обоих, но сначала нужно изменить псевдоним, который, как вы можете себе представить, не идеален.

Ответы [ 2 ]

5 голосов
/ 22 августа 2009

Вы можете использовать конструкцию mixin , чтобы использовать код для конкретной языковой версии, который не действует во всех версиях. Пример:

static if(version_major<2)
{
    alias char* charptr;
}
else
{
    mixin("alias const(char)* charptr;");
}

Что касается вашего фактического вопроса, я бы предложил сделать то же самое, что и при взаимодействии библиотек C с C ++ - определить тип, const(char)* для D2 и char* для D1, но использовать его только в случае необходимости (например, если функция принимает char* для буфера для записи, вероятно, было бы неуместно называть const(char)* чем-то общим, как "charptr"). LPCSTR может работать;)

Я не понял вопроса «Как лучше всего сделать их изменчивыми».

0 голосов
/ 29 августа 2010

Не используйте миксины для этого, это неправильный инструмент для работы. Что вам действительно нужно, так это выражение 'version', о котором вы можете прочитать на странице условной компиляции здесь: http://www.digitalmars.com/d/2.0/version.html

Он не будет компилировать / просматривать код, предназначенный для другой версии. Это позволяет создавать разный код для разных версий D или разных ОС, отличающихся от всех.

Миксины, вероятно, работают, но это тяжелый инструмент, не имеет выделенного кода (внутри кавычек) и просто слишком усложняет вещи. Заявление о версии идеально подходит для этой проблемы.

...