問題タブ [stringification]
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 - Cプログラミング:プリプロセッサ、トークンとしてのマクロ
概念的にこれに似た何かをしようとしていますが、それを機能させることができないようです(最後にエラーが表示されています)。
c - Cマクロで空白を強制しますか?
特別な命名スキームに従って新しい関数を定義するために、次のマクロがあります。
ただし、プリプロセッサは常に連結void
し##func_STUB
ますが、その位置の空白を保持したいのは明らかです。
に文字列を追加するだけでよいことはわかっていますが##func_STUB
、これは私が望んでいることではありません。これをどのように解決しますか?
c++ - CPP: マクロ関数パラメーターのマクロ展開の回避
私がやりたいこと(ログの目的で)は次のようなものです:
このコードは私の問題を示すために書かれています。実際のコードは複雑です。はい、C++ でもマクロを使用する十分な理由があります =)
LOG_ERROR_SIMPLE()
lib パラメーター (" " で囲まれたマクロ名) の文字列化を書き込みます。
ただし、LOG_ERROR
既に展開されているマクロの文字列化 ("2") を書き込みます。lib は展開して呼び出す前に展開されているため、これは予期されたものLOG_ERROR_SIMPLE
です。しかし、これは私が必要とするものではありません。
基本的に私の質問は次のとおりです。別のマクロ関数を呼び出すときに、マクロ関数パラメーターのマクロ展開を回避する方法は?
マクロ展開を回避するために私が使用するトリックがあります。
(x と lib を貼り付けると生成LIB_OTHER
され、この値は を呼び出すために使用されますLOG_ERROR_SIMPLE
。その呼び出しの前に展開されたマクロではありません)
トリックを使用せずにこれと同じ動作を取得する方法はありますか?
c - C(C++)プリプロセッサにとって##はどういう意味ですか?
私は以下のCプログラムを持っています:
プリプロセッサだけを実行すると、これが次のように展開されます
これが、出力が 100 になる理由です。
プリプロセッサが拡張する方法/理由を誰か教えてもらえますかvar##12 to var12
?
gcc - マクロで引数を一重引用符で囲む方法は?
引数を単一引用符で囲むCプリプロセッサ マクロを作成したいと考えています。よく使われるのと同じように#X
。
Q(A)
に拡張したい'A'
。
Linuxでgccを使用しています。
誰にもアイデアはありますか?
私は#
二重引用符を知っています。シングルクォートの同様のメカニズムを探しています。
c++ - Cプリプロセッサで連結文字列をワイド文字に変換する方法は?
連結によって形成された多くの定数文字列(数字など)があるプロジェクトに取り組んでいます。
たとえば、メッセージやエラーを出力するときに、コード内のどこにいるかを知るために使用できる文字列にLOCATION
フォーマットするマクロが__FILE__
あります。__LINE__
したがって、これは「file.cpp(42)」のような場所をフォーマットします。問題は、結果をワイド文字列に変換しようとしたときです。
これは GCC で問題なく動作し、L"file.cpp(42)" がコードに挿入されます。ただし、MSVC++ (Visual C++ 2008 Express を使用) でこれを試みると、エラーが発生します。
L
プレフィックスが式の最初の項にのみ追加されることを理解しています。私もこれを試しました:
これは「機能します」がL"\"file.cpp\" \"(\" \"42\" \")\""
、特にこのマクロが他のマクロと比較して単純であることを考えると、明らかにあまり便利ではない (そして私が探しているものではない) 文字列を提供します。
それで、私の質問は次のとおりです。MSVC ++の式全体に適用するにはどうすればよいので、GCCで得ているのと同じ結果を得ることができますか? 全幅のトークンを含む 2 番目の文字列を作成したくはありません。これは、マクロごとに 2 つのマクロを維持する必要があり、あまり便利ではなく、バグにつながる可能性があるためです。さらに、各文字列の狭いバージョンも必要なので、残念ながらすべて広い文字列を使用することもできません。
c - 無効なプリプロセッサトークンの警告メッセージ
サプライヤのツールから生成された関数がたくさんあり、自分で定義する必要があります。これらの機能のすべての内部機能はまったく同じであるため、マクロを使用して自分の生活を楽にすることができると思いました。
問題のある警告は次のとおりです。
ここで、マクロを次のように定義します。
私のコードでは、次のように記述します。
...等々
なぜこれが起こるのかについて何か考えはありますか?
c-preprocessor - プリプロセッサがスペースを与えるのはなぜですか?
プリプロセッサを使用して行にコメントを付けたい:
$gcc -E filename.c
私が期待したとき
しかし、私は得ました
コンパイラがエラーを表示するように
なぜそれが不要なスペースを与えているのですか?
c++ - #ifdef 内でどのようにマクロ展開を実行しますか?
プリプロセッサ マクロを使用して特定のプレフィックスを他のマクロに追加するかなり一般的なコードがあります。これは何が起こるかの非常に単純化された例です:
「prefix_」は実際には別の場所で定義されているため、ファイルが含まれるたびに異なります。それはうまく機能しますが、トークンの1つが存在しない場合にスキップしたいコードがいくつかありますが、これは機能しません:
私が展開したいのはこれです:
しかし、私は方法を理解できません。展開を行うには MY_VAR() マクロを使用する必要があるため、名前をハードコードすることはできません。(実際には、いくつかのテストコード用です。一連のクラスをテストするたびに、同じコードが異なるプレフィックスで含まれています。いくつかのクラスについては、いくつかのテストをスキップしたいと思います。)
これは C++ プリプロセッサで可能ですか?
アップデート:
問題をさらに実証するためのセミコンパイル可能なコードを次に示します: (下のコメントに押し込まないようにするため)