Я пишу Haskell привязку к какому-либо проекту C и есть функция типаКак передать NULL внешней функции с аргументом type char *?
void foo(char *);
Проблема заключается в том, что foo
проверяет этот указатель для NULL
значения и сделать что-то отличное от нормального поведения. В моей исходной оболочке Haskell для этой функции есть тип foo :: String -> IO()
и с использованием newCString
внутри для маршала аргумента.
Интересно, как я могу передать пользователю NULL
? Я ожидал, что newCString ""
даст мне 0
с "" /= "\0"
, но это не тот случай.
Единственный способ, который я вижу на данный момент, - использовать «» как индикатор того, что пользователь хочет NULL
, но это кажется хакерским. Я ожидаю, что эта проблема довольно распространена, но не нашла вопроса о SO.
«... поскольку« "/ =" \ 0 ", ..." В C один символ 'char s [1] = {0};', другой 'char t [2] = {0 , 0}; '. Оба являются пустыми строками в отношении функций обработки строк, а также 'NULL'. –
Никогда не думал, что 'String' хранятся с 0-терминатором в Haskell. Тогда это имеет смысл. – arrowd
Нет, не в Haskell, но если вы сделаете из них 'CString' (что вам нужно, чтобы передать его на C), добавляется 0-терминатор. Во всяком случае, главное, что пустая строка отличается от «NULL». –