宏用于在C或C ++中定义结构

时间:2014-10-08 11:42:15

标签: c++ c macros c-preprocessor

是否可以定义具有可变大小的数组的结构。像这样的东西:

#define CHAR_ARRAY(MAX_LENGTH) struct CHAR_ARRAY_#MAX_LENGTH{char data[MAX_LENGTH]; int length;};

因此,只有上面的宏,我可以定义不同的数据类型,如下所示。

struct Data{
CHAR_ARRAY(4) a;
CHAR_ARRAY(8) b;
};

由于现有代码的特殊要求,使用" struct"定义的普通旧类型是必需的,不使用std :: array,vector等,特别是指针不被接受,因为我们的遗留代码要求是普通的旧类型,因此可以很容易地处理赋值或复制。

1 个答案:

答案 0 :(得分:5)

是的,可以这样做。您根本不需要命名结构,这使得宏更简单:

#define CHAR_ARRAY(MAX_LENGTH) struct {char data[MAX_LENGTH]; int length;}

(在您的示例中使用。)

但是,我仍然不完全清楚这个宏的用途,因为这实际上重新实现了现有功能。至少你应该使用模板而不是宏来为你生成类型:

template <std::size_t N>
struct char_array { char data[N]; std::size_t length; };

然后使元素类型通用:

template <typename T, std::size_t N>
struct array { T data[N]; std::size_t length; };

...现在这已经变得非常明显,这是std::array的糟糕重新实施,并且不仅仅使用后者还有没有好处。