問題タブ [preprocessor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
12472 参照

c++ - 定義済み/未定義の値に基づいて #ifdef ブロックを排除する C プリプロセッサはありますか?

元の質問

私が望むのは、標準の C プリプロセッサではなく、どこか (おそらく -DNAME1 および -UNAME2 オプションを介したコマンド ライン) から受け入れられるバリエーションであり、どのマクロが定義されているかの仕様であり、デッドを排除します。コード。

いくつかの例を使用すると、私が求めていることを理解しやすくなる場合があります。

コマンドが「-DNAME1」で実行された場合、出力は次のようになります。

コマンドが「-UNAME1」で実行された場合、出力は次のようになります。

どちらのオプションも指定せずにコマンドを実行すると、出力は入力と同じになります。

これは単純なケースです。コードがより複雑なケースも処理できることを願っています。

現実世界の単純な例で説明するには:

コマンドを実行して出力を取得したい-DUSE_VOID -UPLATFORM1

もう一つの例:

-UOLDUNIX理想的には、実行して出力を取得したいと思います。

これは私の運を後押ししているかもしれません!

動機: 多数の条件付きコードを含む大規模で古いコード ベース。条件の多くは適用されなくなりました。たとえば、OLDUNIX プラットフォームは製造されなくなり、サポートも終了したため、コード内でこれを参照する必要はありません。他の条件は常に true です。たとえば、条件付きコンパイルを使用して機能が追加されるため、単一バージョンのコードを、機能が利用できない古いバージョンのソフトウェアと利用できる新しいバージョンの両方に使用できます (多かれ少なかれ)。最終的に、機能のない古いバージョンはサポートされなくなります - すべてが機能を使用します - そのため、機能が存在するかどうかの条件を削除し、「機能が存在しない場合」のコードも削除する必要があります。私'

(ツールの非常に賢いバージョンは、#include'd ファイルを読み取って、コマンド ラインで -D または -U によって指定された制御マクロがそれらのファイルで定義されているかどうかを判断する場合があります。ただし、それが何をするにしても、疑似プリプロセッサはマクロを展開したり、ファイルを逐語的にインクルードしたりしてはなりません. 出力は、入力コードと同様のソースである必要がありますが、通常は入力コードよりも単純でなければなりません.)

現状報告(1年後)

1年間使用した後、選択した回答が推奨する「 sunifdef 」に非常に満足しています。それはまだ間違いを犯していませんし、そうなるとは思っていません。私がそれについて持っている唯一の疑問は文体です。次のような入力が与えられた場合:

'-UC' (C は定義されていません) を指定して実行すると、出力は次のようになります。

「&&」は「||」よりも強く結合するため、これは技術的には正しいのですが、混乱への公然たる招待状です。元のように、「&&」条件のセットを括弧で囲むことをお勧めします。

ただし、私が使用しなければならないコードの一部が不明瞭であることを考えると、それが最大のつまらないものであるということは、強力な賛辞です。それは私にとって貴重なツールです。


ザ・ニュー・キッド・オン・ザ・ブロック

上記の情報に含まれる URL を確認したところ、(予測どおり) 「sunifdef」の後継であるCoanという新しいプログラムがあることがわかりました。これは SourceForge で入手でき、2010 年 1 月から利用できます。私はそれを調べます...今年後半、または来年、あるいはいつか、またはまったく報告しないでしょう。

0 投票する
3 に答える
667 参照

c - Cプリプロセッサ-宿題用

割り当て:

Cプリプロセッサを実装する必要があります。プリプロセッサはコマンドラインツールとして実装され、入力はCソースファイル(.c拡張子)であり、出力は前処理されたファイル(.i拡張子)です。このツールにはいくつかのオプションもあります。

$ cppr <options> file.c

処理が成功すると、ファイル.iが生成されます。

<オプション>は次のようになります。

プリプロセッサオプション
--Aassertion-C-dD -dM -dN -Dmacro [= defn] -E -H
-idirafter dir -include file -imacros file
-iprefixfile -iwithprefix dir -M -MD -MM -MMD -nostdinc
–P- Umacro –undef
ディレクトリオプション
--Bprefix -Idir -I-

上記のいずれか2つを実装します。これは、要件フェーズで決定する必要があります。

これらは、GCCコンパイラによって定義されたオプションです。オプションを理解するには、GCCのマンページを参照してください。

少なくとも次の機能を実装する必要があります。

  1. コメントの削除
  2. #ifdef#endif
  3. #define定数(マクロではない)の場合
0 投票する
70 に答える
124438 参照

c++ - これまでに遭遇した中で最悪のマクロ/プリプロセッサの悪用は何ですか?

あなたがこれまでに遭遇した最悪の 現実世界のマクロ/プリプロセッサの悪用は何ですか?

本当に面白いのであれば、短いスニペットやストーリーを追加してください。目標は、常に人々に「マクロを使うな」と言うのではなく、何かを教えることです。


ps:以前にマクロを使用したことがあります...しかし、通常、「実際の」ソリューションがあると、最終的にそれらを取り除きます(実際のソリューションがインライン化されているため、マクロに似ている場合でも)。


おまけ:マクロがマクロではないソリューションよりも実際に優れていた例を挙げてください。

関連する質問: C++ マクロが役立つのはいつですか?

0 投票する
2 に答える
1724 参照

c - C スタイル: マクロまたはプリプロセッサ?

文字列を一連のパターンと照合するためのライブラリを作成しました。これで、レキシカル スキャナーを C プログラムに簡単に埋め込むことができるようになりました。

レキシカルスキャナーを作成するために利用できる確立されたツールがたくさんあることを私は知っています(頭に浮かぶ最初の2つに名前を付けると、lexとre2c)。レクサーの例は、一般的な問題の具体的なケースにすぎません。

考えられる解決策は 2 つあります。

  1. 埋め込まれた字句解析器を含むソース ファイルをプレーンな C ファイルに変換するプリプロセッサを作成し、場合によっては、コンパイルで使用される他のファイルのセットに変換します。
  2. より読みやすい形式でレクサーを表す一連の C マクロを作成します。

私はすでに両方を行っていますが、質問は次のとおりです。

  • 読みやすさ。レクサーのロジックは明確で理解しやすいものにする必要があります
  • 保守性。バグを見つけて修正するのは悪夢ではありません。
  • ビルド プロセスの干渉。プリプロセッサは、ビルド プロセスで追加の手順を必要とし、プリプロセッサはパス内に存在する必要があります。

言い換えれば、2 つのアプローチのいずれかを使用するソフトウェアを保守または作成する必要がある場合、失望が少ないのはどちらでしょうか?

例として、次の問題のレクサーを次に示します。

  • すべての数値を合計します (1.3E-4.2 のような指数を含む 10 進数形式にすることができます)
  • スキップ文字列 (二重引用符と一重引用符)
  • スキップ リスト (LISP リストと同様: (3 4 (0 1)() 3) )
  • 単語 end (大文字と小文字は区別されません) に遭遇するか、バッファの最後で停止します

2つのスタイルで。


現在の実装に興味がある方は、コードはhttp://sites.google.com/site/clibutlにあります。

0 投票する
1 に答える
706 参照

ant - Ant から呼び出すことができる GNU M4 のような単純なプリプロセッサ/コード ジェネレータはありますか?

古い XSL コードを保守する必要があるのですが、XSL ファイルに多くの重複があることに気付きました。XSL には、コードを別のファイルに移動して、必要なときにインクルードするだけの簡単なインクルード/インポート機能がないようです。

これはモデル駆動型開発ツールで実行できるように思えますが、私はそれについて聞いただけで、実際に使用したわけではなく、おそらく仕事にはやり過ぎです。

インクルード/インポートをサポートする Ant から呼び出すことができる単純なプリプロセッサはありますか?

0 投票する
4 に答える
288 参照

java - Java - マルチバージョン アプリケーションがコードベースを分割しないようにする

私は、いくつかの異なるバージョンで出荷されるアプリケーションを作成しています (最初は、コード ベースの約 10 のバリエーションが存在し、維持する必要があります)。もちろん、コードの 98% 程度は異なるシステム間で同じであるため、コード ベースをそのままにしておくことは理にかなっています。

私の質問は - これを行うための好ましい方法は何ですか? たとえば、いくつかのバージョン (MyClassDifferent) で異なるクラス (MyClass) があり、そのクラスがいくつかの場所で参照されているとします。MyClassDifferent を参照するすべてのクラスを分割するのではなく、コンパイルしているアプリケーションのバージョンに応じてその参照を変更したいと考えています。プリプロセッサ マクロは便利ですが、コードを肥大化させます。また、概念実証の実装しか利用できないのでしょうか?

各アプリケーションの構成ファイルと組み合わせて、ファクトリ パターンのようなものを検討しています。誰にもヒントや指針はありますか?

0 投票する
1 に答える
402 参照

preprocessor - シェーダープリプロセッサーの出力を確認できますか?

プログラムの状態に基づいてランタイムをシェーダーソースに渡す#definesを使用して、巨大なシェーダーを最適化して複雑さを軽減しています。最適化されたシェーダーをファイルに書き込みたいので、次にプログラムを実行するときに#definesを再度渡す必要はありませんが、プログラムの起動時に最適化されたシェーダーを直接コンパイルできます。これで、シェーダーの種類がわかりました。プログラムのニーズによって。

シェーダープリプロセッサーから結果を取得する方法はありますか?もちろん、#define値をファイルに保存し、それに基づいてプログラムの起動時にシェーダーをコンパイルすることはできますが、それはそれほどエレガントではありません。

0 投票する
1 に答える
9293 参照

visual-c++ - Visual C++: コンパイル時のメッセージをコードに埋め込んで表示する方法は?

そのコードがコンパイルされているコンパイル時表示されるコードにメッセージを埋め込む方法はありますか? メッセージは本質的に診断用であり、コンパイル プロセスを変更または中止するべきではありません。

(免責事項: 私はこの質問に対する答えを知っています。スタック オーバーフローで質問されていませんでした。ここのナレッジ ベースへの追加に役立つと思います。)

0 投票する
1 に答える
688 参照

include - cl.exe / E出力が同じで、フラグが同じ場合のオブジェクトファイルの違い

VisualStudio2005のcl.exeコンパイラを使用しています。たくさんの/I/ Dといくつかのコンパイル/最適化フラグ(例:/ Ehsc)を使用して呼び出します。

2つのコンパイルスクリプトがあり、どちらも/ Iフラグのみが異なります(インクルードディレクトリは異なります)。他のすべてのフラグは同じです。これらのスクリプトは、さまざまなオブジェクトファイルを生成します(以下に示すように、タイムスタンプの違いだけではありません)。奇妙なことに、両方のスクリプトの/E出力が同じです。これは、インクルードファイルがオブジェクトファイルの違いを引き起こしていないことを意味しますが、繰り返しますが、違いはどこから来ているのでしょうか?

私の状況で2つの異なるオブジェクトファイルがどのように表示されているかを誰かが説明できますか?インクルードファイルが違いを引き起こしている場合、どうして同じ/ E出力が表示されるのですか?

PS。オブジェクトファイルは、タイムスタンプだけでなく、コードセクションでも異なります。実際、私の最終的な実行可能ファイルの動作は、どちらの場合も異なります。

編集:PSS:cl.exeの/ includeFiles出力を見ても、その出力は同じです。ただし、オブジェクトファイルはタイムスタンプだけでなく異なります(実際、1つはもう1つより1KB大きいです!)

0 投票する
3 に答える
10320 参照

iphone - XCode で iPhone アプリの TARGET_NAME を確認するにはどうすればよいですか?

同じ XCode プロジェクト内に 2 つのバージョンの iPhone アプリケーションを作成しようとしています。コードベースはほぼ同じで、異なる動作が必要な場所では、プリプロセッサの条件と${TARGET_NAME}タグを使用することにしました。

OTHER_CFLAGS" " を含むように設定しました-DTARGET_NAME=${TARGET_NAME}

それから私のコードで私がやろうとした

TARGET_NAME == myApp残念ながら、常に true であるため、常に「lite」が出力TARGET_NAMEされます。私は一生、この文字列比較を評価する方法を理解できません。何か案が?

前もって感謝します