私は、関数がインライン化されないようにする移植性のある方法を考え出しています。私はこの解決策を見つけました。old answer「いつもうまくいかないかもしれない」というコメントがあります。流れの可能性が高い作業残るだけのこと -移植可能なインライン展開の防止
void (*foo_ptr)() = foo;
foo_ptr();
My機能だけで揮発性をインクリメントされ、目的は、(いくつかのトレースハードウェアの行使)検証のためにPCを制御することである、と私は、周囲のコードを懸念していませんよ私が10年後にこれに戻ったとき(新しいツールチェーンで)属性や組み込みアセンブラを使用しないでください(私は既に3つのツールチェーンをサポートする必要があります)、が表示されます。が今動作します。
私は揮発性のアドレスを渡すことでより多くの保護が得られると考えています。これは必要なのですか、あまり醜いものがありますか?
を使用して、自分自身と矛盾するようです。私はPCをチェックするポータブルな方法を知らない。これは常に特定のツールチェーンに依存します。ほとんどのツールチェーンには、インライン展開を防ぐ手段があります(例えばgccでは '__attribute __((__ noinline __))'など)。 – ensc
私はPCを監視しているハードウェアを持っています - 私はそのハードウェアを試す必要があります(テストしません)。 –
別のファイル(コンパイル単位)に入れ、オブジェクト(またはライブラリ)にコンパイルし、結果のオブジェクトを "メイン"プログラムにリンクします。 – wildplasser