CRT のグローバル状態Global state in the CRT

ユニバーサル C ランタイム (UCRT) の一部の関数は、グローバル状態を使用します。Some functions in the Universal C Runtime (UCRT) use global state. たとえば、setlocale()プログラム全体のロケールを設定し、桁区切り記号やテキスト コード ページなどに影響します。For example, setlocale() sets the locale for the entire program, which affects the digit separators, text code page, and so on.

UCRT のグローバル状態は、アプリケーションと OS 間で共有されません。The UCRT's global state is not shared between applications and the OS. たとえば、アプリケーションが を呼setlocale()び出す場合、C ランタイムを使用する OS コンポーネントのロケールには影響しません。For example, if your application calls setlocale(), it won't affect the locale for any OS components that uses the C run-time, or vice-versa.

CRT 関数の OS 固有バージョンOS-specific versions of CRT functions

UCRT では、グローバル状態と対話する関数には、プレフィックスが付いた "ツイン"_o_関数があります。In the UCRT, functions that interact with global state have a "twin" function, prefixed with _o_. 次に例を示します。For example:

  • setlocale()は、アプリ固有のグローバル状態に影響します。setlocale() affects global state specific to the app.
  • _o_setlocale()は、すべての OS コンポーネントで共有されるグローバル状態に影響しますが、アプリには影響しません。_o_setlocale() affects global state shared by all OS components, but not apps.

これらの "ツイン" 関数の唯一の違いは、グローバル CRT 状態を読み書きするときに、OS 固有のバージョン (つまり_o_、で始まるバージョン) が、アプリのグローバル状態のコピーではなく、グローバル状態の OS コピーを使用することです。The only difference between these "twin" functions is that when they read/write the global CRT state, the OS-specific versions (that is, the versions that start with _o_) use the OS copy of global state instead of the app's copy of global state.

これらの機能の OS 固有のバージョンはucrt.osmode.libに記載されています。The OS-specific versions of these functions are in ucrt.osmode.lib. たとえば、OS 固有のバージョンはsetlocale()``_o_setlocale()For example, the OS-specific version of setlocale() is _o_setlocale()

コンポーネントの CRT 状態をアプリの CRT 状態から分離するには、次の 2 つの方法があります。There are two ways to isolate your component's CRT state from an app's CRT state:

  • コンパイラ オプション /MT (リリース) または MTd (デバッグ) を使用して、コンポーネントを静的にリンクします。Statically link your component by using compiler options /MT (release) or MTd (debug). 詳細については、「/MD、/MT、/LD」を参照してください。For details, see /MD, /MT, /LD. 静的リンクはバイナリ サイズを大幅に増加させることに注意してください。Note that static linking can greatly increase binary size.
  • Windows 10 20H2 以降では、CRT に動的にリンクすることで CRT 状態の分離を取得しますが、OS モードのエクスポート _(o_で始まる関数) を呼び出します。Starting with Windows 10 20H2, get CRT state isolation by dynamically linking to the CRT but call the OS-mode exports (the functions that begin with o). OS モード・エクスポートを呼び出す場合は、前と同じ静的リンクを使用しますが、リン/NODEFAULTLIB:libucrt.libカー・オプション/NODEFAULTLIB:libucrtd.lib(リリース) または (デバッグ) 詳細については、/NODEFAULTLIB (ライブラリーの無視) を使用して静的 UCRT を無視してください。To call the OS-mode exports, statically link as before, but ignore the static UCRT by using linker option /NODEFAULTLIB:libucrt.lib (release) or /NODEFAULTLIB:libucrtd.lib (debug) See /NODEFAULTLIB (Ignore Libraries) for details. そして、ucrt.osmode.libリンカー入力に追加します。And add ucrt.osmode.lib to the linker input.


ソース コードで、setlocale()ではなく_o_setlocale()を記述します。In source code, write setlocale(), not _o_setlocale(). にリンクucrt.osmode.libすると、リンカーは OS 固有のバージョンの関数を自動的に置き換えます。When you link against ucrt.osmode.lib, the linker will automatically substitute the OS-specific version of the function. つまり、setlocale()_o_setlocale()置き換えられます。That is, setlocale() will be substituted with _o_setlocale().

これに対ucrt.osmode.libするリンクは、アプリ モードでのみ使用可能な一部の UCRT 呼び出しを無効にします。Linking against ucrt.osmode.lib disables some UCRT calls that are only available in app mode. これらを呼び出そうとすると、リンク エラーが発生します。Attempting to call these will result in a link error.

アプリ/OS 分離の影響を受けるグローバル状態Global state affected by app/OS separation

アプリと OS の状態の分離によって影響を受けるグローバル状態には、次のものが含まれます。Global state affected by the separation of app and OS state includes:

関連項目See also

C ランタイム ライブラリ リファレンスC Run-Time library reference