引数を単一引用符で囲むCプリプロセッサ マクロを作成したいと考えています。よく使われるのと同じように#X
。
Q(A)
に拡張したい'A'
。
Linuxでgccを使用しています。
誰にもアイデアはありますか?
私は#
二重引用符を知っています。シングルクォートの同様のメカニズムを探しています。
引数を単一引用符で囲むCプリプロセッサ マクロを作成したいと考えています。よく使われるのと同じように#X
。
Q(A)
に拡張したい'A'
。
Linuxでgccを使用しています。
誰にもアイデアはありますか?
私は#
二重引用符を知っています。シングルクォートの同様のメカニズムを探しています。
あなたができる最善のことは
#define Q(x) ((#x)[0])
また
#define SINGLEQUOTED_A 'A'
#define SINGLEQUOTED_B 'B'
...
#define SINGLEQUOTED_z 'z'
#define Q(x) SINGLEQUOTED_##x
これは、a
- z
、A
- Z
、0
-9
および_
(および$
一部のコンパイラ) でのみ機能します。
#X
次のコードでわかるように、実際には、引数を二重引用符で囲んでいます。
#define QQ(X) #X
char const * a = QQ(A);
これをgcc -E
(プリプロセッサの出力を表示するために)で実行して確認します
# 1 "temp.c"
# 1 "<built-n>"
# 1 "<command line>"
# 1 "temp.c"
char * a = "A"
引数を一重引用符で囲むには(Cでは1文字であることを意味します)、添え字を使用します
#define Q(X) (QQ(X)[0])
char b = Q(B);
に変換されます
char b = ("B"[0]);
私が考えることができる最高のものは
#define Q(A) (#A[0])
しかし、これは確かにあまりきれいではありません。
これにより、変換が生成されます。
#python
for i in range(ord('a'), ord('n')):
print "#define BOOST_PP_CHAR_%s '%s'" % (chr(i), chr(i))
これはプリプロセッサの部分です:
#ifndef BOOST_PP_CHAR_HPP
#define BOOST_PP_CHAR_HPP
#define BOOST_PP_CHAR(c) BOOST_PP_CHAR_ ## c
// individual declarations
#endif // BOOST_PP_CHAR_HPP
連結を試しました:
#define APOS '
#define CHAR2(a,b,c) a##b##c
#define CHAR1(a,b,c) CHAR2(a,b,c)
#define CHAR(x) CHAR1(APOS,x,APOS)
残念ながら、プリプロセッサは未終了の文字について不平を言います。(複数の文字がある場合は複数文字)プリプロセッサエラーを無効にする方法:(これには特定の警告オプションはありません)
-no-integrated-cpp -Xpreprocessor -w
いくつかの他のトリックを使用したコンパイル時の最適化の例:
#define id1_id HELP
#define id2_id OKAY
#define LIST(item,...) \
item(id1, ##__VA_ARGS__)\
item(id2, ##__VA_ARGS__)\
item(id1, ##__VA_ARGS__)\
#define CODE(id,id2,...) ((CHAR(id##_id) == CHAR(id2##_id)) ? 1 : 0) +
int main() { printf("%d\n", LIST(CODE,id1) 0); return 0; }
id1 を持つアイテムが 2 つあるため、これは "2" を返します。