答えて
m_a
からa
に簡単に行くことはできません。ただし、stringize演算子#
は標準CおよびC++の一部です。次いでSTRING(m_a)
#define STRING(x) #x
を与え例えば
は、"m_a"
に変換されます。
ここではそれについていくつかの話:how-to-make-a-variadic-macro-variable-number-of-arguments
をそれはの#defineを処理するものである(プリプロセッサを持っていることは本当にことはできませんC++コンパイラ自体ではなく)、引数を部分に分解します。したがって、をm_aから抽出しようとしている場合、それはできません。代わりに、マクロを定義する方が良いでしょう:
#define MANIP(m, a, b, c)
そして、 'm'を別の入力にする必要があります。
第2に、文字列以外の入力から文字列入力に簡単に変換できません。 IEのからへ"a"から変換することは容易ではありません。私はCPP(C-Pre-processor)がそれを行うことができることを知って以来、私はそう言い方を変えています。しかし、私はそれが移植可能だとは思わない。
複雑なことをしようとするときは、ではなく、CPPよりものプログラミング言語で作業する必要があります。
具体的には、C++には、CPPの#define文よりもはるかに遠くにできるテンプレートがあります。
文字列マクロ操作#a - ボグの標準です。 –
明確にするために、私はC++のマクロ操作で完璧です。なぜなら、C++でサポートされるようになるからです。私はテンプレートについて知っていますが、私が提案した解決策に直面している特定の問題については、最良のものになるでしょう。 2番目に良いのはMANIP(a、b、c)を書く方が簡単なはずです(私は__VA_ARGS__の各引数を1つの引数で別のマクロに転送する方法を知っています)。 – stepelu
プリプロセッサーはトークンを分割できません。これは、foo
をm_foo
または(最近質問されたように)foo
から"foo"
に製造することが不可能であることを意味します。
Variadicマクロを使用できる場合(Matthieu M.が指摘するように、これはC99またはC++ 0xを意味します)、Jens GustedtのP99 libraryが参考になります。これをさらに簡単にするためのマクロがありますが、これはライブラリに慣れていない人にも読めるようにしましょう。
簡略化されたケース:2つまたは3つの引数が渡されます。
#define MANIP2(a, b) \
f(a, b) \
g(#a, #b)
#define MANIP3(a, b, c) \
f(a, b, c) \
g(#a, #b, #c)
#define MANIP(...) \
MANIP_( \
P99_PASTE2(MANIP, P99_NARG(__VA_ARGS__)), \
__VA_ARGS__) \
#define MANIP_(MANIPMAC, ...) MANIPMAC(__VA_ARGS__)
これは基本原理を示しています。実際には、これをコード化しやすくするためにforeachスタイルのマクロ(Boostのものに似ています)があります(しかし、私が言及したように、初心者では読みにくいです)。詳細は、P99 library documentationを参照してください。
- 1. iPythonのマクロ操作
- 2. Excelマクロ - データ操作
- 3. シェルスクリプトのテキスト操作
- 4. のテキスト操作R
- 5. セル配列のテキスト操作
- 6. C++マクロの副作用
- 7. C#のクエリ操作
- 8. コレクションの操作C#
- 9. C++ newbie:make_sharedの操作
- 10. C++ビット操作
- 11. C++ファイル操作
- 12. C#パス操作
- 13. Cビット操作
- 14. C、ビットマップ操作
- 15. Cポインタ操作
- 16. XLPEカスタム行(画像とテキスト、プッシュコントローラの操作目的)C
- 17. C#でデータを操作する操作
- 18. Javaによるテキスト操作
- 19. UIView回転テキスト操作
- 20. マクロ内のマクロC
- 21. 操作の定義でマクロの中からマクロを使用するには?
- 22. C#new操作バグ?
- 23. C#IOバインド操作
- 24. C++画像操作
- 25. 原子操作 - C
- 26. C#クロススレッド操作エラー
- 27. 操作は[C++ 11]
- 28. C#のバイトの操作
- 29. C#アプリケーションのシステムアイコンの操作
- 30. C++でのセットの操作
"m_a"から "m"を削除したいですか? – Nawaz
マクロのパラメータから先頭のm_を取り除くことは難しいと思います。しかし、マクロとC++は、彼らが何であるかを、私は "不可能"と言うことをためらっています... –
はい、2つの問題があります:m_を取り除き、__VA_ARGS__の各引数に ""を追加する – stepelu