2012-03-01 10 views
1

コードに#if、#ifdefがたくさんある場合。下記のようにCプリプロセッサの分岐を簡単に判断する方法

#ifdef CASE1      
#ifdef CASE1_1 
#define VALUE X 
#else 
#define VALUE Y 
#endif 
#else 
#define VALUE Z 
#endif 

コードがコンパイルされる分岐をすぐに判断する方法はありますか?どんな提案も感謝しています。ありがとう、よろしくお願いします。

+0

コード内に通常の 'if'sのように' #ifdef'とかstuffを入れない理由は分かりませんでした。これはIDEが '# 'で始まる行を自動的に完全にインデントしたくないという事実によって悪化します。 –

+0

@SethCarnegie以前のプリプロセッサは '#'の前に空白を許さなかったので、それをインデントしないという古い習慣はなぜ起こったのでしょう。 –

+0

いくつかの人々はident#ifdef'を行い、私はそれを読めるようにする最良の方法だと思っています。 – Correa

答えて

2

ネストされたプリプロセッサマクロの読み込みは、インデントすることで簡単に行うことができます。


#ifdef foo 
    #define bar (1) 
#endif 

しかし、次のフォームが普遍的に許可する必要があります:ほとんどのプリプロセッサは許可


#ifdef foo 
# define bar (1) 
#endif 

それは巣に従うことができますが、それはあなたがあるパス発見できるようになりますことを保証するものではありません特にコンパイラにオプションを渡して定義を行う場合-D

解決策の1つは、ソースファイル上でプリプロセッサを実行し、出力を検査することです。あなたは手動で、プリプロセッサの実行ファイルを実行して、(例えば。cpp)、またはあなたのコンパイラを伝えることで、プリプロセッサを実行した後に停止することを行うことができます(例。gcc -E)が保証され

は値がのために置換されているものをお見せするためにあなたのプリプロセッサマクロ。しかし、プリプロセッサからの出力は追いつかないことがあります。

あなたはちょうどあなたが自由に(あなたのプリプロセッサはそれをサポートしている場合や#warning#errorを挿入することによって、手動でそれを行うことができます(あなたの例のように)コードの小さなセクションをトレースしようとしている、とからダンプのエラーを見ている場合は、あなたのコンパイラ。これは通常、ビルドシステムを変更して後で見えるようにする必要がないため、最も簡単なオプションです。

プリプロセッサマクロの複雑さにもよりますが、別のプリプロセッサツールをソースファイル上に実行して、プリプロセッサよりも出力が良いようにします。私は過去にfileppで成功しました。

+0

お寄せいただきありがとうございます。私は "#error"が最も簡単な方法であることを発見しました。各コードブランチに入れてコンパイラはエラーを報告します –

0

一部のIDEでは「良い部品」が強調表示され、「不良部品」はグレー表示されます。 (!それはしかし、#defineのを理解している場合のみ)Visual Studioがこれを行い

そしてもちろん、あなたは、ソースの上にプリプロセッサを実行することができますし、出力を見て - 例えば、-Eスイッチでg++に。

0

Visual Studioを信頼しないでください。それは実行するコードをグレーアウトします。特にプロジェクト設定のプリプロセッサマクロとヘッダーファイルで定義されたマクロを混在させる場合は、多くの場合です。

シンプルなアプローチですか?終わり

#ifdef CASE1      
#ifdef CASE1_1 
#define VALUE X 
const int branch = 1; 
#else 
#define VALUE Y 
const int branch = 2; 
#endif 
#else 
#define VALUE Z 
const int branch = 3; 
#endif 

、あなたはその値でコンパイルされてしまった枝を教えてくれます非常にエレガントない変数があるが、それはあなたが尋ねた何んと私はあなたがとにかくデバッグ目的のためにこれを必要と推測しています。: )

1

あなたは

#ifdef CASE1      
# ifdef CASE1_1 
# define VALUE X 
# else 
# define VALUE Y 
# endif 
#else 
# define VALUE Z 
#endif 

コンパイラは文句を言わないであろうと同じインデントスタイルが現在support a quite a number of compilers on many platformsに持っているのQtからqglobal.hに使用されているとして、それをidentをことができます。