コンパイラの警告 (レベル 1 および 3) C4793Compiler Warning (level 1 and 3) C4793

'関数': 関数は、ネイティブ コードとしてコンパイルされます'理由'。'function' : function is compiled as native code: 'reason'

RemarksRemarks

コンパイルできないコンパイラ関数をマネージ コードに場合でも、 /clrコンパイラ オプションを指定します。The compiler cannot compile function into managed code, even though the /clr compiler option is specified. 代わりに、コンパイラは警告 C4793 と、継続の説明メッセージを出力し、コンパイル関数をネイティブ コードにします。Instead, the compiler emits warning C4793 and an explanatory continuation message, and then compiles function into native code. 継続のメッセージが含まれています、理由理由を説明するテキスト関数をコンパイルできませんMSILします。The continuation message contains the reason text that explains why function cannot be compiled to MSIL.

これは、指定すると、レベル 1 の警告、 /clr: 純粋なコンパイラ オプション。This is a level 1 warning when you specify the /clr:pure compiler option. /Clr: 純粋なコンパイラ オプションは Visual Studio 2015 で非推奨とされ、Visual Studio 2017 でサポートされていません。The /clr:pure compiler option is deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017.

次の表は、すべての可能な継続メッセージを一覧表示します。The following table lists all possible continuation messages.

メッセージの理由Reason message RemarksRemarks
整列データ型はマネージ コードではサポートされていませんAligned data types are not supported in managed code CLR できる必要があります、必要に応じて、データを割り当てる場合など、データは宣言に揃えて配置しない可能性もある_ _m128またはalignします。The CLR must be able to allocate data as needed, which might not be possible if the data is aligned with declarations such as __m128 or align.
'_ _Imagebase' を使用する関数がマネージ コードでサポートされていませんFunctions that use '__ImageBase' are not supported in managed code __ImageBase 通常は DLL を読み込む低レベルのネイティブ コードからのみで使用される特殊なリンカー記号。__ImageBase is a special linker symbol that is typically used only by low-level native code to load a DLL.
varargs はではサポートされていません、'/clr' コンパイラ オプションvarargs are not supported by the '/clr' compiler option ネイティブ関数を持つマネージ関数を呼び出すことはできません可変個引数リスト(varargs) 関数は、別のスタック レイアウト要件があるためです。Native functions cannot call managed functions that have variable argument lists (varargs) because the functions have different stack layout requirements. ただし、指定した場合、 /clr: 純粋なコンパイラ オプション、可変個引数のリストはアセンブリには、マネージ関数のみを含めることができますので、サポートされていません。However, if you specify the /clr:pure compiler option, variable argument lists are supported because the assembly can contain only managed functions. 詳細については、次を参照してください。純粋で検証可能なコード (C +/cli CLI)します。For more information, see Pure and Verifiable Code (C++/CLI).
64 ビット CLR では、_ _ptr32 修飾子で宣言されたデータはサポートされません。The 64-bit CLR does not support data declared with the __ptr32 modifier ポインターは、現在のプラットフォームでネイティブ ポインターと同じサイズである必要があります。A pointer must be the same size as a native pointer on the current platform. 詳細については、次を参照してください。 _ _ptr32、 __ptr64します。For more information, see __ptr32, __ptr64.
32 ビット CLR では、_ _ptr64 修飾子で宣言されたデータはサポートされません。The 32-bit CLR does not support data declared with the __ptr64 modifier ポインターは、現在のプラットフォームでネイティブ ポインターと同じサイズである必要があります。A pointer must be the same size as a native pointer on the current platform. 詳細については、次を参照してください。 _ _ptr32、 __ptr64します。For more information, see __ptr32, __ptr64.
1 つまたは複数の組み込み関数がマネージ コードでサポートされていませんOne or more intrinsics is not supported in managed code メッセージが出力される時に、組み込みの名前を使用できません。The name of the intrinsic is not available at the time the message is emitted. ただしのこのメッセージを通常原因となる組み込みとは、低レベルのマシン命令ことを表します。However, an intrinsic that causes this message typically represents a low-level machine instruction.
インラインのネイティブ アセンブリ ('_ _asm') はマネージ コードではサポートされていませんInline native assembly ('__asm') is not supported in managed code インライン アセンブラー コード管理することはできませんが、任意のネイティブ コードを含めることができます。Inline assembly code can contain arbitrary native code, which cannot be managed.
_ _Clrcall で非仮想関数のサンクは、ネイティブとしてコンパイルする必要があります。A non-__clrcall virtual function thunk must be compiled as native 以外の_ _clrcall仮想関数のサンクがアンマネージのアドレスを使用する必要があります。A non-__clrcall virtual function thunk must use an unmanaged address.
'_Setjmp' を使用して関数をネイティブとしてコンパイルする必要があります。A function using '_setjmp' must be compiled as native CLR は、プログラムの実行を制御できる必要があります。The CLR must be able to control program execution. ただし、 setjmp関数の保存と復元のレジスタ、および実行状態などの低レベルの情報によって、通常のプログラム実行をバイパスします。However, the setjmp function bypasses regular program execution by saving and restoring low-level information such as registers and execution state.

Example

次の例では、C4793 が生成されます。The following sample generates C4793.

// C4793.cpp
// compile with: /c /clr /W3
// processor: x86
int asmfunc(void) {   // C4793, compiled as unmanaged, native code
   __asm {
      mov eax, 0
   }
}
warning C4793: 'asmfunc' : function is compiled as native code:
        Inline native assembly ('__asm') is not supported in managed code

次の例では、C4793 が生成されます。The following sample generates C4793.

// C4793_b.cpp
// compile with: /c /clr /W3
#include <setjmp.h>
jmp_buf test_buf;

void f() {
   setjmp(test_buf);   // C4793 warning
}
warning C4793: 'f' : function is compiled as native code:
        A function using '_setjmp' must be compiled as native