strtok_s
strtok_r
の Windows バージョンです。 これはどこでも標準です。
strtok_s
のような関数に関して、プログラムを移植可能にする 1 つの (私が考える一般的な) 方法 /strtok_r
プリプロセッサを使用することです:
#if defined(_WIN32) || defined(_WIN64)
/* We are on Windows */
# define strtok_r strtok_s
#endif
プロトタイプと機能は同じであるため、使用できるのは strtok_r
だけです .
他の回答についてコメントするほどの評判はありません。そのため、独自の回答を提供する必要があります。
1) この声明に対処するには:
<ブロック引用>"strtok_s は、Windows 上の strtok のバッファー オーバーラン セーフ バージョンです。Windows 上の標準の strtok はスレッド セーフです..."
本当じゃない。 strtok_s は、MSVC コンパイラのスレッド セーフ バージョンです。 strtok はスレッドセーフではありません!
2) この声明に対処するには:
<ブロック引用>
「これは、自分自身をウィンドウとして報告するが strtok_r
のような POSIX インターフェイスを持つ Cygwin でコンパイルすると、おそらく壊れるでしょう。 すでに定義されています。」
繰り返しますが、そうではありません。違いは、使用するコンパイラです。 Microsoft の Visual C++ コンパイラ、MSVC を使用する場合、関数は strtok_s.
です。 GNU Compiler Collection、GCC などの別のコンパイラは、strtok_r
などの別の標準ライブラリ実装を使用する場合があります。 .使用する関数を特定するときは、ターゲット プラットフォームではなく、コンパイラを考えてください。
私の意見では、Joachim Pileborg の回答がこのページで最高のものです。ただし、少し編集する必要があります:
#if defined(_WIN32) /* || defined(_WIN64) */
#define strtok_r strtok_s
#endif
_WIN32 と _WIN64 はどちらも、MSVC コンパイラによって提供される定義済みのマクロです。 _WIN64 は、64 ビット ターゲットをコンパイルするときに定義されます。 _WIN32 は、32 ビットと 64 ビットの両方のターゲットに対して定義されています。これは、Microsoft が下位互換性のために行った妥協案です。 _WIN32 は、Win32 API を指定するために作成されました。ここで、Windows API を指定するために _WIN32 を検討する必要があります。これは 32 ビット ターゲットに固有のものではありません。
これらの関数は両方とも、文字列を解析するための非常に見苦しく、直観的でないイディオムであり、通常、特定のアプリケーションの要件を微妙な方法で満たすことができません。プレーンな strtok
の場合はなおさらです 標準Cで。それらを捨てて、独自のコードを書いてchar
を反復する 必要に応じて分割します。 strchr
、 strspn
、および strcspn