2013-01-15 109 views
2

我有下面的宏这是应该得到一个struct CLEAR_ARG,并设置一些值吧:宏定义恶意宏

#define POLICY_ARG_SET((CLEAR_ARG), ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8) \ 
    CLEAR_ARG->arg1= ARG1 \ 
    CLEAR_ARG->arg2 = ARG2; \ 
    CLEAR_ARG->arg3 = ARG3; \ 
    CLEAR_ARG->arg4 = ARG4; \ 
    CLEAR_ARG->arg5 = ARG5; \ 
    CLEAR_ARG->arg6 = ARG6; \ 
    CLEAR_ARG->arg7 = ARG7; \ 
    CLEAR_ARG->arg8 = ARG8; 

,但我得到macro definition malformed for macro警告出于某种原因。

我用宏没有括号在(CLEAR_ARG),并与

POLICY_ARG_SET((&clear_arg),...) 

设置的结构,但我不想总是担心括号。为什么我会得到这个警告,以及如何解决?

回答

7

你错位了括号。在名称和参数中你不能使用它们,你需要在定义中使用它们(被扩展的部分)。

宏改成这样,它应该工作:

#define POLICY_ARG_SET(CLEAR_ARG, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8) \ 
    (CLEAR_ARG)->arg1 = ARG1; \ 
    (CLEAR_ARG)->arg2 = ARG2; \ 
    (CLEAR_ARG)->arg3 = ARG3; \ 
    (CLEAR_ARG)->arg4 = ARG4; \ 
    (CLEAR_ARG)->arg5 = ARG5; \ 
    (CLEAR_ARG)->arg6 = ARG6; \ 
    (CLEAR_ARG)->arg7 = ARG7; \ 
    (CLEAR_ARG)->arg8 = ARG8; 

注意,在你的榜样(CLEAR_ARG)->arg1 = ARG1;缺少分号(;)以及

+2

良好的渔获物。将所有内容放入'do {...} while(0)'子句中,或者至少省略最后一个';'以使所有内容更加适合“通常”C上下文。 –