Ответ 1
## объединяет то, что перед ## с чем после него. Поэтому в вашем примере выполнение ZEND_FN(foo)
приведет к zif_foo
Из любопытства я читаю код API Zend Engine и столкнулся с довольно большим количеством ## в # define. Например, в /usr/lib/php 5/Zend/zend_API.h:
#define ZEND_FN(name) zif_##name
#define ZEND_MN(name) zim_##name
Что означают символы ## (double hash) в этих двух строках?
## объединяет то, что перед ## с чем после него. Поэтому в вашем примере выполнение ZEND_FN(foo)
приведет к zif_foo
Ответ Echo RvV.
Имейте в виду, что при конкатенации литеральных строк вы можете найти некоторые несоответствия между препроцессорами/компиляторами. Для некоторых потребуется ##
#define STR_CAT(s1, s2) s1 ## s2
как в
const char s[] = STR_CAT("concat", "enation")
в то время как другие будут бить на нем, а вместо этого просто потребуют, чтобы два литерала присоединились компилятором (в отличие от предварительного процессора), поэтому потребуется
#define STR_CAT(s1, s2) s1 s2
НТН