コンパイラの警告 (レベル 1 および 3) C4793
'function': 関数はネイティブ コードとしてコンパイルされました: 'reason'
解説
/clr コンパイラ オプションが指定されているにもかかわらず、コンパイラは function をマネージド コードにコンパイルできません。 代わりに、コンパイラは警告 C4793 と説明の継続メッセージを出し、function をネイティブ コードにコンパイルします。 継続メッセージには、function が MSIL
にコンパイルできない理由を説明する reason のテキストが含まれています。
これは、/clr:pure コンパイラ オプションを指定した場合のレベル 1 の警告です。 /clr:pure コンパイラ オプションは Visual Studio 2015 では非推奨とされており、Visual Studio 2017 ではサポートされていません。
次の表は、使用可能なすべての継続メッセージの一覧です。
理由メッセージ | 解説 |
---|---|
アライン データ型はマネージ コードでサポートされていません | CLR は必要に応じてデータを割り当てることができなければなりませんが、データが __m128 や align のような宣言でアラインされている場合は、それができないことがあります。 |
' __ImageBase ' を使用する関数はマネージド コードでサポートされていません | __ImageBase は通常、DLL を読み込むために低レベルのネイティブ コードによってのみ使用される特殊なリンカー シンボルです。 |
varargs は '/clr ' コンパイラ オプションでサポートされていません | ネイティブ関数は、可変引数リスト (varargs) を持つマネージド関数を呼び出すことができません。これは、関数のスタック レイアウト要件が異なるためです。 ただし、/clr:pure コンパイラ オプションを指定した場合、アセンブリにはマネージ関数だけを含めることができるため、可変個引数リストがサポートされます。 詳細は、純粋で検証可能なコード (C++/CLI)を参照してください。 |
64ビット CLR は __ptr32 修飾子で宣言されたデータをサポートしていません | ポインターは、現在のプラットフォームのネイティブ ポインターと同じサイズである必要があります。 詳細は、__ptr32、__ptr64.を参照してください。 |
32ビット CLR は __ptr64 修飾子で宣言されたデータをサポートしていません | ポインターは、現在のプラットフォームのネイティブ ポインターと同じサイズである必要があります。 詳細は、__ptr32、__ptr64.を参照してください。 |
1 つ以上の組み込みがマネージド コードでサポートされていません | 組み込みの名前は、メッセージの生成時には使用できません。 ただしこのメッセージの原因となる組み込みは、通常、低レベルのコンピューター命令を表します。 |
インラインのネイティブ アセンブリはマネージ コードでサポートされていません | インライン アセンブリ コードには、マネージドできない任意のネイティブ コードを含めることができます。 |
非 __clrcall 仮想関数サンクはネイティブとしてコンパイルする必要があります | 非 __clrcall 仮想関数サンクはマネージドされていないアドレスを使用する必要があります。 |
' _Setjmp ' を使用する関数は、ネイティブとしてコンパイルする必要があります | CLR がプログラムの実行を制御できる必要があります。 ただし、setjmp 関数は、レジスタや実行状態などの低レベルの情報を保存、復元することによって、通常のプログラムの実行をバイパスします。 |
例
次の例では 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 が生成されます。
// 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