现在我有以下宏:
#define PHP_FREE_WRAPPED_FUNC_START(name, class_type) \
void free_##class_type(void *name) { \
class_type *p = (class_type *)name;
#define PHP_FREE_WRAPPED_FUNC_END() \
zend_object_std_dtor(&p->std TSRMLS_CC); \
efree(p); \
}
然后我想获得free_test1(void *object)
函数,所以我将使用:
PHP_FREE_WRAPPED_FUNC_START(object, test1)
printf("test1\n");
PHP_FREE_WRAPPED_FUNC_END()
我想获得free_test2(void *object)
功能,所以我会使用:
PHP_FREE_WRAPPED_FUNC_START(object, test2)
printf("test2\n");
PHP_FREE_WRAPPED_FUNC_END()
但是##
无法加入free
和test1
来获取free_test1
,为什么?
答案 0 :(得分:1)
您的问题是您正在使用的C ++样式注释(//)注释掉宏所需的行继续(\)。您可以通过在宏定义之外移动注释,或者使用C样式注释(/ * * /)来解决此问题,如下所示:
#define FUNC_END() \
/* common end code */
}
但是对于这样的小型宏,你甚至可能不需要使用两行:
// common end code
#define FUNC_END() }
答案 1 :(得分:1)
我只是简化您的代码并运行它,您发布的代码可以正常运行,##
可以将free_
和class_type
加在一起。
#define PHP_FREE_WRAPPED_FUNC_START(name, class_type)\
void free_##class_type(void *name) {\
printf("%s\n",name);
#define PHP_FREE_WRAPPED_FUNC_END()\
printf("End\n");\
}\
PHP_FREE_WRAPPED_FUNC_START(hello,test1)
printf("Middle\n");
PHP_FREE_WRAPPED_FUNC_END()
int main(void)
{
free_test1("start");
return 0;
}
它运作良好。
我看到评论是关于backslash
的。我想你已经修复了这个错误。