Out of curiousity, I\'m reading the Zend Engine API code and encountered quite a number of ## in their #define\'s. For example, at /usr/lib/php5/Zend/zend_API.h:
<
The ## concatenates what's before the ## with what's after it. So in your example doing ZEND_FN(foo)
would result in zif_foo
Echo RvV's answer.
Be aware that when concatenating literal strings you may find some inconsistencies between pre-processors/compilers. Some will require the ##
#define STR_CAT(s1, s2) s1 ## s2
as in
const char s[] = STR_CAT("concat", "enation")
whereas other will baulk at it, and instead just require that the two literals will be joined by the compiler (as opposed to the pre-processor), so will require
#define STR_CAT(s1, s2) s1 s2
HTH
http://www.cppreference.com/wiki/preprocessor/sharp