c++ __VA_ARGS__中的逗号导致宏定义的错误扩展

pxy2qtax  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(121)

__VA_ARGS__中的逗号导致宏定义的错误扩展,如下所示

My_Stu_t my_stu = {

    .member2 = {1},
    3}( member3, {2,3} )
};

我希望正确的结果应该是这样的

My_Stu_t my_stu = {

    .member1 = {1},
    .member3 = {2,3},
};

我知道为什么会产生这个错误,但我不知道如何解决它,请帮助,谢谢。

这里是我的代码:test.c

typedef struct {
    int member1[1];
    int member2[1];
    int member3[2];
} My_Stu_t;

#define MEMBER_AUX( a, b, c, ... )  c
#define MEMBER_WITHOUT_DEFAULT_VALUE( Name, ... )
#define MEMBER_WITH_DEFAULT_VALUE( Name, ... )  .Name = __VA_ARGS__,

#define MEMBER( Name, ... )  MEMBER_AUX( , ##__VA_ARGS__, MEMBER_WITH_DEFAULT_VALUE, MEMBER_WITHOUT_DEFAULT_VALUE )( Name, __VA_ARGS__ )
#define STD_MEMBER( ArrSize, Name, ... )  MEMBER( Name, ##__VA_ARGS__ )

My_Stu_t my_stu = {
    STD_MEMBER( 1, member1)
    STD_MEMBER( 1, member2, {1} )
    STD_MEMBER( 2, member3, {2,3} )
};

预处理输出:gcc test. c-E

My_Stu_t my_stu = {

    .member2 = {1},
    3}( member3, {2,3} )
};
unhi4e5o

unhi4e5o1#

让我们进入现代时代。

#define STD_MEMBER(arrsize, name, ...)  __VA_OPT__(.name = __VA_ARGS__,)
My_Stu_t my_stu = {
    STD_MEMBER(1, member1)
    STD_MEMBER(1, member2, {1})
    STD_MEMBER(2, member3, {2,3})
};
6tqwzwtp

6tqwzwtp2#

关于#define List( ... ) __VA_ARGS__

typedef struct {
    int member1[1];
    int member2[1];
    int member3[2];
} My_Stu_t;

#define MEMBER_AUX( a, b, c, ... )                  c
#define MEMBER_WITHOUT_DEFAULT_VALUE( Name, ... )
#define MEMBER_WITH_DEFAULT_VALUE( Name, ... )      .Name = __VA_ARGS__,
#define MEMBER( Name, ... )                         MEMBER_AUX( , ##__VA_ARGS__, MEMBER_WITH_DEFAULT_VALUE, MEMBER_WITHOUT_DEFAULT_VALUE )( Name, __VA_ARGS__ )

#define List( ... ) __VA_ARGS__
#define STD_MEMBER( ArrSize, Name, ... )            MEMBER( Name, ##__VA_ARGS__ )

My_Stu_t my_stu = {
    STD_MEMBER( 1, member1)
    STD_MEMBER( 1, member2, List( { 1 } ) )
    STD_MEMBER( 2, member3, List( { 2, 3 } ) )
};

预处理输出:gcc test. c-E

My_Stu_t my_stu = {

    .member2 = { 1 },
    .member3 = { 2, 3 },
};

相关问题