【実行形式】 rmifdef [-nvT] [-l[A] list1] [-d list2] file 【パラメータ】 -nvT: n 行番号を付加します。 v 表示を逆にします(削除するものを表示します)。 T 入力ファイルを単なるテキストデータとみなします。 -l[A] list1 list1で指定されたものについては、これが「真」となる箇所を出力します。 正確には、この各識別子が定義済みであるとして各ifdef文を判定します。 -lAを指定した場合、list1以外の無効なifdefを全て削除します。 list1及びlist2は次の形式になります。 string-1[,string-2...] string-nには次のものを指定します。 ? 任意の1文字と一致 * 任意の文字列と一致 x 0-9,a-z,A-Z,'_'のいずれか -d list2 list2で指定されたものについては、これが「偽」となる箇所を出力します。 正確には、この各識別子が未定義であるとして各ifdef文を判定します。 file 対象ファイル名
【補足説明】 (1)制限事項 @ソースは、コンパイルOKになっている必要があります。 A#ifについては、次の形式のみ処理できます。 ・#if 0[//〜] … elseセクションが出力されます。 ・#if 1[//〜] … thenセクションが出力されます。 ・#if [!]defined(name)[|| [!]defined(name2) ...][//〜] ・#if [!]defined(name)[&& [!]defined(name2) ...][//〜] … "!defined"の場合には、判定が逆になります。 条件式は、"||"または"&&"の一方のみを使用したものが判定対象となります。 なお、nameが定義されているかどうかを判定しているわけでないため、 実際のコンパイル結果と異なることにもなります。 ・#if name[//〜] … これはnameが0以外の定数値であることを仮定しています。 もしこの定数値が0であると、コンパイル結果とは結果が逆になります。 B#elifについては、以下の構文に対してのみ対応しています。 #if 条件式1 セクション1 #elif 条件式2 セクション2 [#elif 条件式3 セクション3 ........] [#else セクションn] #endif 上記の各条件式は、Aの#ifの条件式と同じになります。 ただし、#elifは -l(-lAを除く)、-dオプション指定の場合には、エラーになります。 C"#"と"ifdef"等の間にスペースを入れたものは認識できますが、コメント(/*〜*/) を入れた ものは認識できません。(2)オプションを何も指定しない場合には、結果は以下のようになります。 #ifdef NAME statement1 //これは表示されません。 #else statement2 //これが表示されます。 #endif #ifndef NAME statement3 //これが表示されます。 #else statement4 //これは表示されません。 #endif #if 0 statement5 //これは表示されません。 #else statement6 //これが表示されます。 #endif #if 1 statement7 //これが表示されます。 #else statement8 //これは表示されません。 #endif (3)"-l NAME1"と指定した場合には、以下のようになります。 #ifdef NAME1 statement1 //これが表示されます。 #else statement2 //これは表示されません。 #endif #ifdef NAME2 //これは全て表示されます。 statement1 #else statement2 #endif #if 0 //これは全て表示されます。 statement5 #else statement6 #endif #if 1 //これは全て表示されます。 statement7 #else statement8 #endif (4)"-lA NAME1"と指定した場合には、以下のようになります。 #ifdef NAME1 statement1 //これが表示されます。 #else statement2 //これは表示されません。 #endif #ifdef NAME1 statement1 //これが表示されます。 #ifdef NAME2 statement2 //これは表示されません。 #else statement3 //これが表示されます。 #endif #else statement4 //これは表示されません。 #endif #if 0 statement1 //これは表示されません。 #else statement2 //これが表示されます。 #endif #if 1 statement1 //これが表示されます。 #else statement2 //これは表示されません。 #endif #define NAME1 0 //この場合も、結果は同じになります。 #if NAME1 statement1 //これが表示されます。 #else statement2 //これは表示されません。 #endif #undef NAME1 #if NAME1 statement1 //これが表示されます。 #else statement2 //これは表示されません。 #endif #if defined(NAME1) statement1 //これが表示されます。 #elif defined(NAME2) statement2 //これは表示されません。 #else statement3 //これは表示されません。 #endif #if !defined(NAME1) statement1 //これは表示されません。 #elif defined(NAME2) statement2 //これは表示されません。 #else statement3 //これが表示されます。 #endif #if !defined(NAME1) statement1 //これは表示されません。 #elif !defined(NAME2) statement2 //これが表示されます。 #else statement3 //これは表示されません。 #endif (5)"-lA NAME1,NAME2"と指定した場合には、以下のようになります。 #ifdef NAME1 statement1 //これが表示されます。 #else statement2 //これは表示されません。 #endif #ifdef NAME2 statement3 //これが表示されます。 #else statement4 //これは表示されません。 #endif #ifdef NAME1 statement5 //これが表示されます。 #else #ifdef NAME2 //これは全て表示されません。 statement6 #endif #endif #if defined(NAME1) statement7 //これが表示されます。 #else statement8 //これは表示されません。 #endif #if !defined(NAME1) statement9 //これは表示されません。 #if defined(NAME2) //これは全て表示されません。 statement10 #else statement11 #endif #else //NAME1 else #if defined(NAME2) statement12 //これが表示されます。 #else statement13 //これは表示されません。 #endif #endif (6)論理式の判定で、"-l NAME1"と指定した場合には、以下のようになります。 #if defined(NAME1) || defined(NAME2) statement1 //これが表示されます。 #else statement2 //これは表示されません。 #endif #if defined(NAME1) || !defined(NAME2) statement3 //これが表示されます。 #else statement4 //これは表示されません。 #endif #if !defined(NAME1) || defined(NAME2) //これは判定結果が不定となるため全て表示されます。 statement5 #else statement6 #endif #if !defined(NAME1) || !defined(NAME2) //これは全て表示されます。 statement7 #else statement8 #endif #if defined(NAME1) && defined(NAME2) //これは全て表示されます。 statement11 #else statement12 #endif #if defined(NAME1) && !defined(NAME2) //これは全て表示されます。 statement13 #else statement14 #endif #if !defined(NAME1) && defined(NAME2) statement15 //これは表示されません。 #else statement16 //これが表示されます。 #endif #if !defined(NAME1) && !defined(NAME2) statement17 //これは表示されません。 #else statement18 //これが表示されます。 #endif (7)"-d NAME1"と指定した場合には、以下のようになります。 #ifdef NAME1 statement1 //これは表示されません。 #else statement2 //これが表示されます。 #endif #ifdef NAME2 //これは全て表示されます。 statement3 #else statement4 #endif (8)論理式の判定で、"-d NAME1"と指定した場合には、以下のようになります。 #if defined(NAME1) || defined(NAME2) //これは全て表示されます。 statement1 #else statement2 #endif #if defined(NAME1) || !defined(NAME2) //これは全て表示されます。 statement3 #else statement4 #endif #if !defined(NAME1) || defined(NAME2) statement5 //これが表示されます。 #else statement6 //これは表示されません。 #endif #if !defined(NAME1) || !defined(NAME2) statement7 //これが表示されます。 #else statement8 //これは表示されません。 #endif #if defined(NAME1) && defined(NAME2) statement11 //これは表示されません。 #else statement12 //これが表示されます。 #endif #if defined(NAME1) && !defined(NAME2) statement13 //これは表示されません。 #else statement14 //これが表示されます。 #endif #if !defined(NAME1) && defined(NAME2) //これは全て表示されます。 statement15 #else statement16 #endif #if !defined(NAME1) && !defined(NAME2) //これは全て表示されます。 statement17 #else statement18 #endif (9)"-l NAME1 -d NAME*"と指定した場合には、NAME1は「真」となるものが表示され、それ以外の"NAME*"に該当するものは、「偽」となるものが表示されます。 (10)"-d NAME1 -l NAME*"と指定した場合には、NAME1は「偽」となるものが表示され、それ以外の"NAME*"に該当するものは、「真」となるものが表示されます。