• 締切済み

自動でステップオーバーされる関数にしたい

Visual StudioでF11をおしてステップインしたときに エラーの起こりようがないような関数の中には入らないようにできないでしょうか。 class HOGE{ int hoge; public: int getHoge(){ return hoge; } //このような関数にステップインしたくない }; リリースビルドではインライン関数にするとステップインできないようになりますが、 デバッグビルドでも問答無用でステップインしないようにする方法はありませんか? または、デバッグビルドでも関数単位でインライン展開を指定できるような方法はありませんか? __forceinlineをつけても、やはりデバッグビルドでは無視されてしまいました。

みんなの回答

  • davidfox
  • ベストアンサー率58% (21/36)
回答No.2

/GZ (デバッグ ビルド時のリリース ビルド エラーのキャッチ) これを削除してはどうですか? VC6(古いですが)で見ると CALL 命令は生成されないのでステップインしません。 しかしながら言うまでも無いですが、ステップインするかどうかはデバッガの機能なので、インライン展開されようがされまいが、本来はコード生成には関係の無い事です。ソースコードが関数呼び出し形式である限り、ステップインする可能性はあります。 従って VC6 の組み込みのデバッガで、/GZ が無い場合のインライン展開された関数ならステップインしないように見える。と言う程度に受け取ってください。

haporu
質問者

補足

回答ありがとうございます。 バージョンを書き忘れていましたが、2010です。 2010では/GZの代わりに/RTC1が使われているようですのです。 /RTC1を1つのファイルで外してみたところ、以下のように警告が出ましたが、コンパイルはできました。 warning C4653: コンパイラ オプション '最適化 (1 つ以上の /Oawstgp[y]) またはデバッグ チェック (1 つ以上の /GZ、/RTCcsu)' はプリコンパイル済みヘッダーのものと一致しません。現在のオプションを優先しプリコンパイルのオプションは無視されます。 warning C4651: '/D__MSVC_RUNTIME_CHECKS' がプリコンパイル済みヘッダーに定義されていますが、現在のコンパイル処理には定義されていません。 しかし、No.1の補足のように、実装をclass内に書くとリンクできないし、外に書くと普通にステップインしてしまいました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

class HOGEをライブラリ化してリリース版でビルドしたものをリンクする

haporu
質問者

補足

回答ありがとうございます。 インライン関数を別ファイルとしてリンクする方法を教えていただけませんか? //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」そのものを自らのライブラリに実装できないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ゲッタ、セッタについて

    ゲッタ、セッタについて 質問させて頂きます。 あるクラスのメンバに、int型の変数hogeがあるとし、これをハンガリアンに則って、_nHogeと命名したとします。 これに対するゲッタ・セッタを作る場合、正しい関数名はどうなるのでしょうか? ただし、関数名に対する規約は無いものとします。 (1) int get_nHoge(); (2) int getnHoge(); (3) int getHoge(); (4) int Hoge(); (5) その他

  • インスタンス化したクラスを関数に渡したい

    class GAMMA { public: //コンストラクタ GAMMA(); int SetGammaValue(int value) { gamma_kind=value; return 0; } private: int gamma_kind; }; GAMMA gamma;//インスタンス化 この後に、このインスタンス化した「gamma」を Function(gamma)の様に関数渡しをしたいのですが、 うまくいきません。 そもそもclassは関数渡しできるのでしょうか? 構造体は関数渡しできるのは確認済みなのですが・・・。 関数部分は Function(class gamma) { } の様にすればいいのでしょうか?

  • 関数ポインタにvirtual関数を与えたいです

    //関数ポインタについて質問させてください。 //error C2440: '=' : 'void (__thiscall A::* )(int,int)' から 'void (__cdecl *)(int,int)' に変換できません。 //というエラーが出ます。 //どうすればいいのか教えてください。 //よろしくお願いします。 #include<stdio.h> class A { public: void (*aaa)(int a,int b); virtual void test(int a,int b)=0; virtual void test2(int a,int b)=0; void execute() { aaa=test;//error C2440 } }; class B : public A { public: void test(int a,int b) { printf("test"); } void test2(int a,int b) { printf("test2"); } }; int main() { B b; b.execute(); b.aaa(2,3); return 0; }

  • デバッグ開始でbin\Releaseにファイルが作成されてしまう。

    デバッグ開始でbin\Releaseにファイルが作成されてしまう。 Visual Studio 2008でC#によるWindowsアプリケーションを作成しているのですが、デバッグ開始を実行するとbin\Releaseにexeファイルなどが作成されてしまいます。 ビルドするとbin\Releaseにexeファイルなどが作成されます。 デバッグ開始の実行でbin\Debugにexeファイルなどが作成され、ビルドするとbin\Releaseに作成されるようにしたいのですが、どうすれば良いですか? ちなみに***.vshost.exeはbin\Releaseに作成されます。 これもbin\Debugに作成されるようにしたいです。

  • クラスを公開する部分を制限するには?

    以下の例のようなクラスを書きました。 ========================== #include<Hoge.h> class Moge{ public:  int getCountHoge(void); private:  Hoge* d; }; ========================== これをライブラリとして、他の人に使ってもらうように 公開しようと考えています。 ただ、上記のままヘッダーファイルを配ってしまうと、 使用者にとって不要だと思われる Hoge.h の include が 発生してしまいます。 実際には、Hoge.h は 他のクラスを使用したり、 inline 関数などを多用した少々重い実装となっています。 なんらかの方法で、これを抑制できないでしょうか? 試しに以下のようにprivate 部分を削除したヘッダーファイルを 公開用に別途用意してみましたが、実行時エラーとなってしまいました。 (ライブラリコンパイル時は元のヘッダーファイルを使用して、 使用者側ソースは下記ヘッダーファイルを使用しました。) ========================== class Moge{ public:  int getCountHoge(void); }; ========================== よろしくお願いします。

  • c++からdll内の関数を呼ぶ記述方法が知りたいです。

    VC++2008 Expressを使っています。 c++からdll内の関数を呼ぶ記述方法が知りたいです。 hoge.dllの関数 int test(int x); c++ ??????????

  • メンバ関数にconstをつけた際の問題

    C++を勉強中の学生です。 以下のようなコードで問題が起こりました。 class TEST{ private: int mArray[10]; //(int a;) public: int* get_mArray(void) const; //(int get_a(void) const;) }; int* TEST::get_mArray(void) const{ return mArray;    //配列の先頭要素の値を受け取りたい。 } //(関係のありそうな部分のみを抜き出しました) このコードにおいて、関数は値を変えない事が明白なので、constをつける必要性はないのですが(癖でつけた際に発生した問題です)、 なぜconstをつけると動作しなくなるのか知りたいです。 //()で囲った部分を有効にし、 int TEST::get_a(void) const{return a;}という関数はエラーにならなかったのですが、どのような違いがあるのでしょうか? 出たエラーは(visual C++ 2010) 'const int [10]' から 'int *' に変換できません。 というものでした。 ポインタとconst関連の部分を手持ちの本で勉強しなおしたのですが、解答を得られなかったのでこちらで質問させてもらいます。

  • 警告「代入される前に使われている」を出す方法

    bccで以下のコードをコンパイルすると。 「'i' は、おそらく値が代入される前に使われている」 と警告が出ますが、 「'h' は、おそらく値が代入される前に使われている」 とは警告を出してくれません。 警告を出す方法ってないでしょうか? Hogeメンバに bool 型の初期化フラグでも実装しようかな・・・。 #include <iostream> class Hoge { public: Hoge(){ } Hoge( int i ){ t = i; } operator int(){ return t; } int t; }; int main() { int i; Hoge h; std::cout << i << std::endl; std::cout << h << std::endl; return 0; }

  • C++ Builderでのpublic変数の扱いについて

    class TForm1 { ・・・ public: int i;   ・・・ } のように宣言した変数iは他の関数から どのように参照したらいいのでしょうか?

  • 関数で整数の受け渡しについて。

    VisualC++6.0 SDI でプログラムの勉強をしています。 マルチスレッドから int型 の整数を受け渡ししたいのですが、 「'identifier' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。」 とエラーが出てしまいます。どうしたらよいでしょうか? どのような処理をしているのか抜き出しました。 見難い上に、私の理解が不十分なため必要な記述が抜けているかもしれませんが、 指摘、アドバイスなどよろしくお願いします。 //マルチスレッドの中に記述し int count の整数を受け渡す記述 //pInst は class CSerialへのポインタ for(count =0; count<3; count++){ pInst->TransmitData(count); 処理;//ここで int count を使いたい。 } // class Serial class CSerial { public: CSerial(CEvent *Event); ~CSerial(void); private: void TransmitData(int count); }; // 継承?? オーバーライド?? はっきりとは理解できていません。 void CSerial::TransmitData(int count) {//m_Eventは class Event へのポインタ  m_Event->OnPollingSend(count); } // Class Event class CEvent { public: CEvent() { } virtual ~CEvent() { } virtual void OnPollingSend(int count) = 0; }; //Class Event が書かれているファイルを#includeしています。 void CPollingDlg::OnPollingSend(int count) { マルチスレッドスタート;//すでにスタートしていたらジャンプ 処理;//ここで int count を使いたい } //ボタンはclassWizard で作りました(INT)は後から付けてしてみました。 //ボタンが押されたら呼び出されます。 ON_BN_CLICKED(ID_POLLING_SEND, OnPollingSend(INT)) // 生成されたメッセージ マップ関数 afx_msg void OnPollingSend(INT);