CRT でのグローバル状態

ユニバーサル C ランタイム (UCRT) の一部の関数では、グローバル状態が使用されます。 たとえば、プログラム全体のロケールを設定します。これは、数字の区切り記号、テキスト コード ページなどに setlocale() 影響します。

UCRT のグローバル状態は、アプリケーションと OS の間では共有されます。 たとえば、アプリケーションが を呼び出した場合、C 実行時を使用する OS コンポーネントのロケールには影響しません。それ以外の方法 setlocale() では影響しません。

OS 固有のバージョンの CRT 関数

UCRT では、グローバル状態と対話する関数には、先頭に が付く "ツイン" 関数があります _o_ 。 たとえば、次のように入力します。

  • setlocale() は、アプリに固有のグローバル状態に影響します。
  • _o_setlocale() は、すべての OS コンポーネントによって共有されるグローバルな状態に影響しますが、アプリには影響を与え "" ではありません。

これらの "ツイン" 関数の唯一の違いは、グローバル CRT 状態の読み取り/書き込みを行う場合、OS 固有のバージョン (つまり、 で始まるバージョン) は、アプリのグローバル状態のコピーではなく、グローバル状態の OS コピーを使用する点です。 _o_

これらの関数の OS 固有のバージョンは、 に含まれています ucrt.osmode.lib 。 たとえば、 の OS 固有のバージョンは 次 setlocale() のようになります。 _o_setlocale()

コンポーネントの CRT 状態をアプリの CRT 状態から分離するには、次の 2 つの方法があります。

  • コンパイラ オプション (リリース) または (デバッグ) を使用して、コンポーネント /MT を静的 /MTd にリンクします。 詳細については 、「/MD、/MT、/LD 」を参照してください。 静的リンクを使用すると、バイナリ サイズが大幅に増加する可能性があります。
  • Windows バージョン 2004 Windows 10 バージョンより、CRT に動的にリンクしますが、OS モードのエクスポート(oで始まる関数) を呼び出します。 OS モードのエクスポートを呼び出す場合は、以前と同様に静的にリンクしますが、リンカー オプション (リリース) または (デバッグ) を使用して静的 UCRT /NODEFAULTLIB:libucrt.lib/NODEFAULTLIB:libucrtd.lib 無視します。 リンカー入力 ucrt.osmode.lib に を追加します。 詳細 については、「/NODEFAULTLIB (ライブラリを無視する)」 を参照してください。

注意

ソース コードで、 ではなく を setlocale() 記述します _o_setlocale() 。 にリンクすると、リンカーは OS 固有のバージョンの関数に ucrt.osmode.lib 自動的に置き換わる。 つまり、 setlocale() は に置き換えされます _o_setlocale()

にリンクすると ucrt.osmode.lib 、アプリ モードでのみ使用できる一部の UCRT 呼び出しが無効になります。 これらを呼び出しようとすると、リンク エラーが発生します。

アプリ/OS の分離の影響を受けるグローバル状態

アプリと OS の状態の分離の影響を受けるグローバル状態には、次が含まれます。

関連項目

C Run-Time ライブラリ リファレンス