naked (C++)
Microsoft 固有の仕様 →
naked 属性を指定して宣言されている関数の場合、コンパイラでプロローグおよびエピローグ コードのないコードが生成されます。 この機能を使用して、プロローグとエピローグのコード シーケンスをインライン アセンブラー コードで独自に記述できます。 naked 関数は、仮想デバイス ドライバーの記述用に特に便利です。 naked 属性は x86 と ARM でのみ有効であり、x64 では使用できないことに注意してください。
__declspec(naked) declarator
解説
naked 属性は関数の定義だけに関連し、型修飾子には関連しないため、naked 関数は拡張属性構文と __declspec キーワードを使用する必要があります。
コンパイラは、関数もまた __forceinline キーワードでマークされていても、naked 属性でマークされた関数のインライン関数を生成できません。
メンバーではないメソッドの定義以外のすべてに naked 属性が適用されている場合、コンパイラ エラーが発生します。
例
次のコードは naked 属性の関数を定義します。
__declspec( naked ) int func( formal_parameters ) {}
または、次のようにします。
#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
naked 属性は、関数のプロローグとエピローグのコード シーケンスをコンパイラが生成するかどうかにのみ影響を与えます。 このような関数を呼び出すために生成されるコードには影響を与えません。 したがって、naked 属性は関数の型の一部と見なされず、関数ポインターは naked 属性を持つことができません。 さらに、naked 属性は、データ定義に適用できません。 たとえば、次のサンプル コードはエラーになります。
__declspec( naked ) int i; // Error--naked attribute not
// permitted on data declarations.
naked 属性は、関数定義にだけ関連し、関数のプロトタイプでは指定できません。 たとえば、次の宣言はコンパイラ エラーになります。
__declspec( naked ) int func(); // Error--naked attribute not
// permitted on function declarations
END Microsoft 固有の仕様