Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法增加一个宏?_C++ - Fatal编程技术网

C++ 有没有办法增加一个宏?

C++ 有没有办法增加一个宏?,c++,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 OFFS

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

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

按照原来的顺序,

#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

在任何情况下,如果你只有四个,这是过分的

只需使用枚举:

enum class offsets { 
    X = 0,
    Y = 1,
    Z = 2,
    W = 3 
};
别担心。想要自动递增吗?更简单的是:

enum class offsets { X = 0, y, z, w };
为了同样的效果

注意我建议使用
enum类
,因此用法是
offsets::X
offsets::Y
等等


在某些情况下,您可能更喜欢使用
constexpr std::array
,然后可以对其进行迭代(这是宏或枚举所无法做到的).

改用
枚举
\uuuuu计数器\uuuuuuu
不是标准的afaik。我最好的梦想是宏的死亡。看起来你是在重新创建枚举。没有任何开销。它的性能完全相同。(枚举是编译时常量)