問題タブ [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.
macros - プリプロセッサ マクロ引数の引用
いくつ#define NAME name
かのマクロがあり、引用された値に展開される他のマクロを定義したいとします。つまり、あたかも も定義したかのようです#define NAME_STR "name"
。以下よりもきちんとした方法はありますか?
c - ハッシュは gcc のプリプロセッサによってどのように評価されますか?
stdint.h (newlib から) のこのブロックの目的は何ですか?
このマクロは、後で整数比較のためにヘッダーで使用されますが、どのように評価されるのかわかりません。例えば:
c++ - 可変個引数のマクロ引数でC++プリプロセッサの文字列化を使用する方法はありますか?
私の推測では、この質問への答えはノーですが、方法があれば素晴らしいでしょう。明確にするために、私が次のマクロを持っていると仮定します。
私がやりたいのは、可変個引数関数に渡す前に、Xのすべての変数に対して何らかの方法で文字列化を実行することです。ここでのキーワードは前です。マクロ定義内から個々の引数に実際にアクセスする方法はないことに気付きましたが、次のようなものを使用して、すべての引数を文字列化する方法はありますか?
c++ - プリプロセッサ tomfoolery (#include の文字列化)
注: この質問は、OpenCL 自体とは何の関係もありません。私の質問の簡潔な説明については、最後の段落を確認してください。しかし、いくつかの背景を提供するために:
OpenCL を利用する C++ コードを書いています。私は自分の OpenCL カーネルのソースを独自のファイルに保持して、コーディングとメンテナンスを容易にするのが好きです (関連する C++ コードにソースを文字列定数として直接埋め込むのではなく)。これは必然的に、バイナリを配布するときに OpenCL ランタイムにそれらをロードする方法の問題につながります。理想的には、OpenCL ソースがバイナリに含まれているため、バイナリが特定の場所にある必要はありません。 OpenCLソースコードがどこにあるかを知るために、いくつかのディレクトリ構造内で。
OpenCL ファイルを文字列定数としてどこかに含めたいと思います。できれば、追加のビルド手順や外部ツールを使用せずに (クロスコンパイラ/クロスプラットフォームの使いやすさのために...つまり、toxxd
などは使用しません)。このスレッドの 2 番目の回答に基づいて、次のようなテクニックを見つけたと思いました。
STRINGIFY
可能であれば、OpenCLコードにマクロを埋め込まないことをお勧めします(上記のSOの質問で行われたように)。現在、これは Clang/LLVM コンパイラで素晴らしく機能しますが、GCC は恐ろしい死に方をします (「マクロ STRINGIFY を呼び出す未終了の引数リスト」と、.cl ファイルの内容に関連するさまざまな構文「エラー」が表示されます)。したがって、明らかに、この正確な手法はコンパイラ間で使用できません (MSVC は試していませんが、そこでも動作するようにしたいと思います)...コンパイラ間で動作するように最小限にマッサージするにはどうすればよいですか?
要約すると、外部ツールを呼び出したり、余分なコードでファイルを汚染したりせずに、ファイルの内容を C/C++ 文字列定数として含めるための標準準拠の手法が必要です。アイデア?
EDIT : Potatoswatter が指摘したように、上記の動作は定義されていないため、文字列化されるファイルに触れることを含まない真のクロスコンパイラ プリプロセッサ手法はおそらく不可能です (凶悪なほとんど/すべてのコンパイラで機能するハックは回答ポイントを取得します)。興味深いことに、ここでの 2 番目の応答で提案されていることを実行することになりました...つまり、STRINGIFY
含めていた OpenCL ファイルにマクロを直接追加しました。
でsomefile.cl
:
でsomefile.cpp
:
これは、私が試したコンパイラ (マクロ内にプリプロセッサ ディレクティブがないため、Clang と GCC も同様) で機能し、少なくとも私のコンテキストでは負担が大きすぎません (つまり、そうではありません)。 t は、OpenCL ファイルの構文の強調表示/編集を妨げません)。このようなプリプロセッサ アプローチの特徴の 1 つは、隣接する文字列が連結されるため、次のように記述できることです。
STRINGIFY マクロが両方のファイルにある限り.cl
、文字列が連結され、OpenCL コードをモジュール化できます。
arrays - Array.toString() は ActionScript 3 のままであることが保証されていますか?
の出力をArray.toString()
ユーザーに表示しても問題ありませんか?それとも、ActionScript 3 または他のコンパイラの将来のバージョンで文字列形式が変更される可能性はありますか?
c++ - cpp を使用してマクロを文字列に変換するにはどうすればよいですか?
GNU の cpp を使用すると、マクロパラメーターを次のように文字列に変換できます。
次にSTR(hi)
、"hi"
しかし、マクロ (マクロ パラメーターではない) を文字列に変換するにはどうすればよいでしょうか。
たとえば、ある値を持つマクロ CONSTANT があるとします。
これは機能しません: STR(CONSTANT)
. これ"CONSTANT"
は、私たちが望むものではない結果をもたらします。
c - C プリプロセッサの「文字列化」の反対
C プリプロセッサを使用する場合、次のようにマクロ引数を文字列化できます。
したがって、使用すると、結果は次のようになります。
TO_STRING(test)
次のように展開されます。"a string with test"
逆に何かいい方法はないでしょうか?入力引数として文字列リテラルを取得し、C 識別子を生成しますか? 例えば:
TO_IDENTIFIER("some_identifier")
次のように展開されます。some_identifier
回答ありがとうございます。
編集:何のために必要なのか疑問に思っている人のために:
3D エンジンのシーン グラフ内のノードを文字列識別子で参照したいのですが、同時に、タイトなループで文字列を比較することは避けたいと考えていました。そこで、コンパイルのビルド前のステップで実行し、定義済みの文字列を検索する簡単なツールを作成することにしましたID("something")
。次に、そのようなトークンごとに、括弧内の文字列の CRC32 を計算し、それらの数値識別子を含む #defines を含むヘッダー ファイルを生成します。たとえば、文字列の"something"
場合は次のようになります。
#define __CRC32ID_something 0x09DA31FB
ID(x)
次に、生成されたヘッダー ファイルは、マクロを使用して各 cpp ファイルにインクルードされます。もちろん、ID("something")
は に展開される__CRC32ID_something
ため、実質的にコンパイラが認識するのは、人間にわかりやすい文字列ではなく、単純な整数識別子です。もちろん、ここでは単純に解決しますが、引用符を使用する方がより理にかなっていると思いました。マクロID(something)
がどのように機能するかを知らないプログラマーは、実際にはそのような識別子が存在しない場合でも、引用符がないと C 識別子であると考えることができます。全て。ID
something
c - 連結前にマクロ展開を行う方法は?
これは次のように展開されます。
入手方法:
?
visual-c++ - C++ プリプロセッサでの奇妙な定義
私はこれに出くわしました
「c##_」という単語以外はすべて明らかですが、これはどういう意味ですか?
c - Cプリプロセッサの文字列化の奇妙さ
ログの目的で、ファイル名と行番号を保持する定数文字列に評価されるマクロを定義しています。
それは正常に動作しますが、2 つの追加マクロが必要な理由がわかりSTRINGIFY
ませTOSTRING
ん__FILE__ ":" #__LINE__
。
これは私には醜いハックのように思えます。
__LINE__
正しく文字列化されるようにステージごとに何が起こるのか、なぜ と のどちらも機能しないのか、誰かが詳細に説明できます__FILE__ ":" STRINGIFY(__LINE__)
か__FILE__ ":" #__LINE__
?