У меня недостаточно репутации, чтобы комментировать другие ответы, поэтому я должен предоставить свой.
1) Для решения этого заявления:
"strtok_s - это безопасная версия strtok для Windows, переполненная буфером.
стандартный strtok на окнах потокобезопасен ... "
Это не правда. strtok_s - это потокобезопасная версия для компилятора MSVC. strtok не безопасен для потоков!
2) Для решения этого заявления:
"Это, вероятно, сломалось бы при компиляции на Cygwin, который сообщает о себе
как windows, но имеет интерфейсы POSIX, такие как strtok_r
, уже определены. "
Опять не правда. Разница в том, какой компилятор вы используете. При использовании компилятора Microsoft Visual C ++ MSVC используется функция strtok_s.
Другой компилятор, такой как коллекция компиляторов GNU, GCC, может использовать другую реализацию стандартной библиотеки, например strtok_r
. При определении того, какую функцию использовать, думайте о компиляторе, а не целевой платформе.
На мой взгляд, ответ Иоахима Пилеборга самый лучший на этой странице. Тем не менее, он нуждается в небольшом редактировании:
#if defined(_WIN32) /* || defined(_WIN64) */
#define strtok_r strtok_s
#endif
И _WIN32, и _WIN64 являются предопределенными макросами, предоставляемыми компилятором MSVC. _WIN64 определяется при компиляции 64-битной цели. _WIN32 определен для 32- и 64-битных целей. Это компромисс, который Microsoft сделала для обратной совместимости. _WIN32 был создан для указания Win32 API. Теперь вы должны рассмотреть _WIN32 для указания Windows API - это не относится к 32-битной цели.