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 isn't 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 the other way around.

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 (release) または (デバッグ) を使用して、コンポーネントを静的にリンク /MTd します。Statically link your component by using compiler options /MT (release) or /MTd (debug). 詳細については、「 /md、/mt、/ld」を参照してください。For details, see /MD, /MT, /LD. 静的リンクを使用すると、バイナリサイズを大幅に増やすことができます。Static linking can greatly increase binary size.
  • Windows 10 バージョン2004以降では、CRT に動的にリンクしますが、OS モードのエクスポート ( _o_で始まる関数) を呼び出します。Starting with Windows 10 version 2004, dynamically link to the CRT but call the OS-mode exports (the functions that begin with o). OS モードのエクスポートを呼び出すには、を前と同じように静的にリンクしますが、リンカーオプション /NODEFAULTLIB:libucrt.lib (release) または (debug) を使用して静的 UCRT を無視し /NODEFAULTLIB:libucrtd.lib ます。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). とを ucrt.osmode.lib リンカー入力に追加します。And add ucrt.osmode.lib to the linker input. 詳細については、「 /NODEFAULTLIB (ライブラリを無視する) 」を参照してください。See /NODEFAULTLIB (Ignore Libraries) for details.

注意

ソースコードでは、では 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