VC PlusPlus:マクロ定義を展開した後のプログラムを確認する方法 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(概要)
(概要)
 
32行: 32行:
 
// Q_INIT_RESOURCE(resource1);
 
// Q_INIT_RESOURCE(resource1);
 
     do { extern int QT_MANGLE_NAMESPACE(qInitResources_resource1) ();       
 
     do { extern int QT_MANGLE_NAMESPACE(qInitResources_resource1) ();       
         QT_MANGLE_NAMESPACE(qInitResources_ resource1) (); } while (false)
+
         QT_MANGLE_NAMESPACE(qInitResources_resource1) (); } while (false)
  
 
// Q_INIT_RESOURCE(resource2);
 
// Q_INIT_RESOURCE(resource2);
 
     do { extern int QT_MANGLE_NAMESPACE(qInitResources_resource2) ();       
 
     do { extern int QT_MANGLE_NAMESPACE(qInitResources_resource2) ();       
         QT_MANGLE_NAMESPACE(qInitResources_ resource2) (); } while (false)
+
         QT_MANGLE_NAMESPACE(qInitResources_resource2) (); } while (false)
 
</syntaxhighlight2>
 
</syntaxhighlight2>
  
  
 こうなりました。nameだったところにresource1というキーワードが入りました。マクロは引数一つで二つ以上の場所に展開できるので1行目と2行目両方がかわりました。そしたら。
+
 こうなりました。nameだったところにresource1というキーワードが入りました。マクロは引数一つで二つ以上の場所に展開できるので1行目と2行目両方がかわりました。そしたらQT_MANGLE_NAMESPACEの引数自体が、文字列として再定義されるだけの動きをするのがQT_MANGLE_NAMESPACEの部分なので、それを解読すると、
  
  
53行: 53行:
 
// Q_INIT_RESOURCE(resource1);
 
// Q_INIT_RESOURCE(resource1);
 
     do { extern int qInitResources_resource1();
 
     do { extern int qInitResources_resource1();
         qInitResources_ resource1 (); } while (false)
+
         qInitResources_resource1 (); } while (false)
  
 
// Q_INIT_RESOURCE(resource2);
 
// Q_INIT_RESOURCE(resource2);
 
     do { extern int qInitResources_resource2();
 
     do { extern int qInitResources_resource2();
         qInitResources_ resource2 (); } while (false)
+
         qInitResources_resource2 (); } while (false)
 
</syntaxhighlight2>
 
</syntaxhighlight2>
  
65行: 65行:
 
do {
 
do {
 
       extern int qInitResources_resource1();
 
       extern int qInitResources_resource1();
       qInitResources_ resource1();
+
       qInitResources_resource1();
 
   }while(false)
 
   }while(false)
  
 
do {  
 
do {  
 
       extern int qInitResources_resource2();
 
       extern int qInitResources_resource2();
       qInitResources_ resource2();
+
       qInitResources_resource2();
 
   }while(false)
 
   }while(false)
 
</syntaxhighlight2>
 
</syntaxhighlight2>
77行: 77行:
  
  
 こういうことを確認する術があります。知らないよりは知っていた方が良いかもです。かなり深いプリプロッセッサになっている場合はコンパイルにもの凄く時間がかかりますが、ちょっとの我慢です。
+
 こういうことを機械的に確認する術があります。知らないよりは知っていた方が良いかもです。かなり深いプリプロッセッサになっている場合はコンパイルにもの凄く時間がかかりますが、ちょっとの我慢です。
  
  
 
===''' マクロ定義展開方法 '''===
 
===''' マクロ定義展開方法 '''===
 VisualStudioの特定のcppファイルのプロパティを変更することでプリプロセッサ処理後のプログラムを吐き出すことが出来ます。
+
 VisualStudioの特定のcppファイルのプロパティを変更することでプリプロセッサ処理後のプログラムを吐き出すことが出来ます。併せて、インクルードされているすべての変数、関数、クラス宣言が掌握できます。
  
  
118行: 118行:
  
  
 これで出力object(*.obj)ファイルが出力されるフォルダと同じ階層に*.iという名前で前処理の結果が出力されます。object(*.obj)ファイルは生成されません。先ほども記述しましたが、展開された部分を探すのに疲れる場合もあるかもしれませんが、マクロ展開された部分は必ずあります。根気よく検索で探しましょう。探しきれない場合は一度、かなりユニークな文字列の引数をマクロに設定して試すとよいかもしれません。先ほどの出力エディタに表示するのとは異なる内容で、展開中にファイルを行き来するので、ファイルの途中でのファイル離脱時は、その行番号を、行先の行番号とファイル名が表示されます。より、わかりやすいですが、単純に行ったり来たりすることもあるので、冗長に感じる場合もあります。
+
 これで出力object(*.obj)ファイルが出力されるフォルダと同じ階層に*.iという名前で前処理の結果が出力されます。object(*.obj)ファイルは生成されません。先ほども記述しましたが、展開された部分を探すのに疲れる場合もあるかもしれませんが、マクロ展開された部分は必ずあります。根気よく検索で探しましょう。探しきれない場合は一度、かなりユニークな文字列の引数をマクロに設定して試すとよいかもしれません。先ほどの出力エディタに表示するのとは異なる内容で、展開中にファイルを行き来するので、ファイルの途中でのファイル離脱時は、その行番号を、行先の行番号とファイル名が表示されます。より、わかりやすいですが、単純に行ったり来たりすることもあるので、冗長に感じる場合もあります。あー、展開処理に満足したら、設定は最初の状態に戻しておいてくださいね。
  
  

2021年3月18日 (木) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス