宏定义格式错误的宏

Itz*_*984 2 c macros

我有以下宏,它应该获取一个结构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;
Run Code Online (Sandbox Code Playgroud)

macro definition malformed for macro出于某种原因我收到了警告.

我使用了没有括号的宏(CLEAR_ARG),并设置了结构

POLICY_ARG_SET((&clear_arg),...)
Run Code Online (Sandbox Code Playgroud)

但我不想总是担心括号.为什么我会收到此警告,如何解决?

Veg*_*ger 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;
Run Code Online (Sandbox Code Playgroud)

注意,在您的示例中(CLEAR_ARG)->arg1 = ARG1;也缺少分号(;)

  • 接得好.将所有内容放在`do {...} while(0)`子句中,或者至少省略最后的`;`以使所有内容更好地适应"通常"C可能也是一个好主意.上下文. (2认同)