不知道怎么说这个但是,有没有办法增加一个宏?
我有几个偏移宏,第一个定义的偏移量必须为零,下一个必须为1,依此类推。 如果我需要在列表中间添加偏移宏,手动增加其下的所有偏移量会很麻烦。
//How can I turn this...
// v This number needs to increment by 1 (no matter the order)
#define OFFSET_X 0
#define OFFSET_Y 1
#define OFFSET_Z 2
#define OFFSET_W 3
//Into something like this... (order of macros swapped yet the numbering still goes from 0 to 3)
int num = 0;
#define OFFSET_Z num++ // = 0 (was 2)
#define OFFSET_Y num++ // = 1 (was 1)
#define OFFSET_X num++ // = 2 (was 0)
#define OFFSET_W num++ // = 3 (was 3)
答案 0 :(得分:2)
使用原始订单
#define OFFSET_X 0
#define OFFSET_Y (OFFSET_X + 1)
#define OFFSET_Z (OFFSET_Y + 1)
#define OFFSET_W (OFFSET_Z + 1)
或使用帖子第二部分中的修订顺序
#define OFFSET_Z 0
#define OFFSET_Y (OFFSET_Z + 1)
#define OFFSET_X (OFFSET_Y + 1)
#define OFFSET_W (OFFSET_X + 1)
等。因为所有这些都是在编译时进行评估的,所以无论如何都没有。
或者你可以写一个代码生成器,如果你真的很无聊,并让它为你生成值。
或者只使用枚举。这就是他们的目的,无论如何它们都被编译器视为常量 - 但是你得到了编译时错误检查,这对于宏来说效果要差得多。
但是,在C ++ 11中可能会添加constexpr
更好的解决方案。
在任何情况下,如果你只有其中的四个,那就太过分了。
答案 1 :(得分:1)
只需使用枚举:
enum class offsets {
X = 0,
Y = 1,
Z = 2,
W = 3
};
并且不要出汗。想要自动增量?更容易:
enum class offsets { X = 0, y, z, w };
同样的效果。
注意我已经建议enum class
,因此使用情况为offsets::X
,offsets::Y
等。
在某些情况下,您可能更喜欢constexpr std::array
,然后您可以迭代(您可以使用宏或枚举)。