問題タブ [c-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.
c++ - エラー: マクロ名は #ifdef 0 を使用した識別子でなければなりません
C++ で記述されたアプリケーションのソース コードがあり、次のようにコメントしたいだけです。
そして、私はこのエラーが発生します
エラー: マクロ名は識別子でなければなりません
なぜこうなった?
metaprogramming - C プリプロセッサ ディレクティブをネストできますか?
たとえば、次のことが可能ですか。
c++ - コードがWindowsにコンパイルされているかどうかを判断するマクロはありますか?
コンパイルしているOSがWindowsかどうかを確認したいと思います。それを確認するためにチェックできる簡単なマクロはありますか?
c - 定数C式はコンパイル時または実行時に評価されますか?
他のプリプロセッサ定数を使用して操作を実行する#defineを作成した場合、実行時にマクロが表示されるたびに最終値が計算されますか?これはコンパイラの最適化に依存しますか、それとも標準でカバーされていますか?
例:
TIMER_100_MSマクロを使用するたびに、実行時に32768/10の操作が発生しますか?
次のことは避けたいと思います。
概要
コンパイラーは、コンパイル時に配列サイズなどを計算するために必要であるため、定数積分式を評価できる必要があります。ただし、標準では、「できる」(「しなければならない」ではなく)としか書かれていません。したがって、脳死したコンパイラだけがコンパイル時に定数積分式を評価しませんが、型にはまらないコンパイラのアセンブリ出力を簡単にチェックすると、それぞれのケースが検証されます。
c - C プリプロセッサが特定の #include ディレクティブを無視するようにする
ここではパーサージェネレーターを使用していますが、残念ながら、
生成されたすべてのソース ファイルの先頭に ヘッダーは長い間名前が変更されています。コンパイラ (gcc) に新しいヘッダーを使用させることは問題ありませんが、-include new/header.h
生成されたすべてのファイルから上記のディレクティブを削除すると、ビルド プロセスが複雑になります。
単に無視するようにgccに指示する方法はありsome/file.h
ますか?
c++ - #include ディレクティブでファイル拡張子を省略できるのはいつですか?
gmock をいじっていて、次の行が含まれていることに気付きました。
私は期待していたでしょうtuple.h
。
拡張機能を除外してもよいのはいつですか? また、ディレクティブに別の意味を与えるのですか?
gcc - gccプリプロセッサに空白を保持させる方法は?
コードの場合:
gccプリプロセッサ出力:
空白を保持するように強制するにはどうすればよいですか?
gcc-Esomefile.cコマンドでプリプロセッサを呼び出します。
c++ - プリコンパイラを使用した文字列連結
次の問題があります。複数行のテキスト ファイルを としてインクルードしたい#define
、つまり、テキスト ファイルの値を格納する定数が必要です。例:
そして、(コンパイル時に)定数を次のスタイルで初期化したい
ここで、文字列 "This\nis\na\ntextfile" は、ファイル f.txt の行を連結して得られます。プリプロセッサ コマンド/マクロを使用してこれを達成する方法はありますか?
c++ - C++ 匿名変数
なぜこれがうまくいかないのですか?
上記のマクロ展開の結果
__LINE__
そのマクロを引数として書かなくて済むと便利です。
問題はかなり明確だと思います。同じスコープ内で複数の変数を宣言するときに、このマクロが再定義エラーで失敗しないように、匿名変数を生成できるようにしたいと考えています。私の考えは、__LINE__
このように同じ行で変数が宣言されることはないため、定義済みのマクロを使用することでした。しかし、マクロ展開が私を悩ませています。助けてもらえますか?
更新:正解
リュック・トゥライユに感謝します。ただし、提案されたソリューションには小さな問題がありました。オペランドと ## 演算子の間には空白が必要です (明らかに標準ではそうではないと書かれていますが、演算子とオペランドの間に空白がないと、PS3 風味の GCC はマクロを適切に展開しません)。
VAR_LINE マクロは次のようになります。
これは、Win32 (Visual Studio 2008)、XBOX360 (Xenon)、および PS3 で動作することが確認されています。
c# - 見積もりが必要: プリプロセッサの使用は悪い OO プラクティスです
私は、プリプロセッサ ディレクティブの使用は#if UsingNetwork
OO の悪習であると信じています。他の同僚はそうではありません。IoC コンテナー (Spring など) を使用する場合、それに応じてプログラムされていれば、コンポーネントを簡単に構成できると思います。このコンテキストではIsUsingNetwork
、IoC コンテナによってプロパティを設定するか、「ネットワークを使用する」実装の動作が異なる場合は、そのインターフェイスの別の実装を実装して注入する必要があります (例: IService
、ServiceImplementation
、NetworkingServiceImplementation
)。
基本的に「IoCコンテナを介して構成する必要がある動作を構成しようとする場合、プリプロセッサの使用は悪いOOプラクティスです」と書かれている本のOO-Gurusまたは参照の引用を誰かが提供してもらえますか?
同僚にリファクタリングを説得するには、この引用が必要です...
編集:コンパイル中にターゲットプラットフォーム固有のコードを変更するためにプリプロセッサディレクティブを使用することは問題なく、それがプリプロセッサディレクティブの目的であることを知っており、同意します。ただし、適切に設計されたテスト可能なクラスとコンポーネントを取得するには、コンパイル時構成ではなくランタイム構成を使用する必要があると思います。つまり、#define と #if を本来の目的を超えて使用すると、コードのテストが困難になり、クラスの設計が不適切になります。
誰かがこれらの行に沿って何かを読んで、私が参照できるように私に与えることができますか?