怎么写C宏?

时间:2016-07-24 15:14:11

标签: c

现在我有以下宏:

#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() 

但是##无法加入freetest1来获取free_test1,为什么?

2 个答案:

答案 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的。我想你已经修复了这个错误。