- 締切済み
自動でステップオーバーされる関数にしたい
Visual StudioでF11をおしてステップインしたときに エラーの起こりようがないような関数の中には入らないようにできないでしょうか。 class HOGE{ int hoge; public: int getHoge(){ return hoge; } //このような関数にステップインしたくない }; リリースビルドではインライン関数にするとステップインできないようになりますが、 デバッグビルドでも問答無用でステップインしないようにする方法はありませんか? または、デバッグビルドでも関数単位でインライン展開を指定できるような方法はありませんか? __forceinlineをつけても、やはりデバッグビルドでは無視されてしまいました。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- davidfox
- ベストアンサー率58% (21/36)
/GZ (デバッグ ビルド時のリリース ビルド エラーのキャッチ) これを削除してはどうですか? VC6(古いですが)で見ると CALL 命令は生成されないのでステップインしません。 しかしながら言うまでも無いですが、ステップインするかどうかはデバッガの機能なので、インライン展開されようがされまいが、本来はコード生成には関係の無い事です。ソースコードが関数呼び出し形式である限り、ステップインする可能性はあります。 従って VC6 の組み込みのデバッガで、/GZ が無い場合のインライン展開された関数ならステップインしないように見える。と言う程度に受け取ってください。
- gerugugu84
- ベストアンサー率37% (29/78)
class HOGEをライブラリ化してリリース版でビルドしたものをリンクする
補足
回答ありがとうございます。 インライン関数を別ファイルとしてリンクする方法を教えていただけませんか? //hoge.h class HOGE{ int hoge; public: int getHoge(); }; //hoge.cpp (デバッグビルドのデフォルトオプション + /Zi /Ob2) class HOGE{ int hoge; public: int getHoge(){ return hoge; } }; //main.cpp(デバッグビルドのデフォルトオプション) #include "hoge.h" int _tmain(int argc, _TCHAR* argv[]){ HOGE h; int a = h.getHoge(); return 0; } としたところ 1>lib3.obj : error LNK2019: 未解決の外部シンボル "public: int __thiscall HOGE::getHoge(void)" (?getHoge@HOGE@@QAEHXZ) が関数 _wmain で参照されました。 となってしまいました。 //hoge.cpp (デバッグビルドのデフォルトオプション + /Zi /Ob2) #include "hoge.h" int HOGE::getHoge(){ return hoge; } としたところHOGE::getHogeがインライン関数ではないので、普通にステップインしてしまいました。 質問には書いておりませんでしたが、ヘッダオンリーライブラリを作っているので、 できればcppファイルに実装を書きたくないのです。 また、このような単純な関数はインラインとしたいです。 いろいろと調べていて「DebuggerStepThroughAttribute」というのを見つけたのですが、clrを使用しないと使えないようです。 clrなしでもこのような属性を使う方法をご存じないですか? または、「DebuggerStepThroughAttribute」そのものを自らのライブラリに実装できないでしょうか?
補足
回答ありがとうございます。 バージョンを書き忘れていましたが、2010です。 2010では/GZの代わりに/RTC1が使われているようですのです。 /RTC1を1つのファイルで外してみたところ、以下のように警告が出ましたが、コンパイルはできました。 warning C4653: コンパイラ オプション '最適化 (1 つ以上の /Oawstgp[y]) またはデバッグ チェック (1 つ以上の /GZ、/RTCcsu)' はプリコンパイル済みヘッダーのものと一致しません。現在のオプションを優先しプリコンパイルのオプションは無視されます。 warning C4651: '/D__MSVC_RUNTIME_CHECKS' がプリコンパイル済みヘッダーに定義されていますが、現在のコンパイル処理には定義されていません。 しかし、No.1の補足のように、実装をclass内に書くとリンクできないし、外に書くと普通にステップインしてしまいました。