相关疑难解决方法(0)

MSVC不会正确扩展__VA_ARGS__

考虑以下代码:

#define F(x, ...) X = x and VA_ARGS = __VA_ARGS__
#define G(...) F(__VA_ARGS__)
F(1, 2, 3)
G(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

X = 1 and VA_ARGS = 2, 3两个宏的预期输出,这就是我用GCC得到的,但是,MSVC将其扩展为:

X = 1 and VA_ARGS = 2, 3
X = 1, 2, 3 and VA_ARGS =
Run Code Online (Sandbox Code Playgroud)

也就是说,__VA_ARGS__将其扩展为单个参数,而不是分解为多个参数.

有什么方法吗?

visual-c++ c-preprocessor variadic-macros

48
推荐指数
2
解决办法
1万
查看次数

可以通过参数的数量来重载宏吗?

如何做这项工作?如何实现C99/C++ 11可变参数宏以根据给出多少参数来扩展到不同的东西?

c c++ overloading c-preprocessor variadic-macros

41
推荐指数
3
解决办法
1万
查看次数

C/C++枚举:检测多个项目映射到相同值的时间

是否有编译时方法来检测/防止C/C++枚举中的重复值?

问题在于有多个项目被初始化为显式值.

背景:

我继承了一些C代码,如下所示:

#define BASE1_VAL    (5)
#define BASE2_VAL    (7)

typedef enum
{
  MsgFoo1A = BASE1_VAL,       // 5
  MsgFoo1B,                   // 6
  MsgFoo1C,                   // 7
  MsgFoo1D,                   // 8
  MsgFoo1E,                   // 9
  MsgFoo2A = BASE2_VAL,       // Uh oh!  7 again...
  MsgFoo2B                    // Uh oh!  8 again...
} FOO;
Run Code Online (Sandbox Code Playgroud)

问题是随着代码的增长和开发人员向MsgFoo1x组中添加更多消息,最终它会超出BASE2_VAL.

这段代码最终会迁移到C++,所以如果只有一个C++解决方案(模板魔术?),那没关系 - 但是使用C和C++的解决方案更好.

c c++ enums

22
推荐指数
2
解决办法
8906
查看次数