Я пытаюсь использовать эту функцию в программа на C, которая должна быть способна компилироваться в Linux и Windows. Сначала я попытался использовать strtok_r, но затем, когда я скомпилировал в Windows, он пожаловался на то, что функция не существует, и сказал, что предположит, что это внешняя функция, но затем не удалось . Затем я использовал strtok_s, и он скомпилировался! Затем я попробовал на Linux, но теперь он жалуется, что есть «неопределенная ссылка на 'strtok_s'».
Один является функцией только Windows, а другой функцией Linux ??? Что я могу сделать, чтобы он компилировался на обоих?
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);