好奇心から、Zend Engine API コードを読んでいると、#define でかなりの数の ## に遭遇しました。たとえば、/usr/lib/php5/Zend/zend_API.h:
#define ZEND_FN(name) zif_##name
#define ZEND_MN(name) zim_##name
この 2 行の ## (ダブル ハッシュ) 記号は何を意味していますか?
好奇心から、Zend Engine API コードを読んでいると、#define でかなりの数の ## に遭遇しました。たとえば、/usr/lib/php5/Zend/zend_API.h:
#define ZEND_FN(name) zif_##name
#define ZEND_MN(name) zim_##name
この 2 行の ## (ダブル ハッシュ) 記号は何を意味していますか?
## は、## の前にあるものとその後にあるものを連結します。したがって、あなたの例では、次のようになりZEND_FN(foo)
ますzif_foo
エコーRvVの答え。
リテラル文字列を連結するときに、プリプロセッサ/コンパイラ間でいくつかの不整合が見つかる可能性があることに注意してください。##が必要なものもあります
#define STR_CAT(s1, s2) s1 ## s2
のように
const char s[] = STR_CAT("concat", "enation")
一方、他の人はそれを嘲笑し、代わりに2つのリテラルが(プリプロセッサではなく)コンパイラによって結合されることを要求するので、
#define STR_CAT(s1, s2) s1 s2
HTH