В чем разница между strtok_r и strtok_s в C?

Я пытаюсь использовать эту функцию в программа на C, которая должна быть способна компилироваться в Linux и Windows. Сначала я попытался использовать strtok_r, но затем, когда я скомпилировал в Windows, он пожаловался на то, что функция не существует, и сказал, что предположит, что это внешняя функция, но затем не удалось . Затем я использовал strtok_s, и он скомпилировался! Затем я попробовал на Linux, но теперь он жалуется, что есть «неопределенная ссылка на 'strtok_s'».

Один является функцией только Windows, а другой функцией Linux ??? Что я могу сделать, чтобы он компилировался на обоих?

22
задан petranaya 26 January 2012 в 16:29
поделиться

1 ответ

MinGW также предопределяет _WIN32, но поддерживает strtok_r, поэтому я не считаю хорошей идеей проверять макрос _WIN32. Лучше проверить макрос _MSC_VER, который является макросом для Microsoft Visual Studio.

#ifdef _MSC_VER
#define strtok_r strtok_s
#endif

ВНИМАНИЕ: Microsoft strtok_s и C11 strtok_s совершенно разные! Microsoft strtok_s имеет только 3 параметра, в то время как C11 strtok_s имеет 4 параметра, поэтому в будущем это может стать проблемой.

Прототипом Microsoft strtok_s является

char* strtok_s(char* str, const char* delimiters, char** context);

Прототипом C11 strtok_s является

char *strtok_s(char *restrict str, rsize_t *restrict strmax, const char *restrict delim, char **restrict ptr);
0
ответ дан 29 November 2019 в 03:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: