有没有办法增加一个宏?

时间:2018-06-02 21:50:32

标签: c++

不知道怎么说这个但是,有没有办法增加一个宏?

我有几个偏移宏,第一个定义的偏移量必须为零,下一个必须为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)

2 个答案:

答案 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::Xoffsets::Y等。

在某些情况下,您可能更喜欢constexpr std::array,然后您可以迭代(您可以使用宏或枚举)。