在 C 或 C++ 中定义结构的宏

Posted

技术标签:

【中文标题】在 C 或 C++ 中定义结构的宏【英文标题】:Macro to define a struct in C or C++ 【发布时间】:2014-10-08 11:42:15 【问题描述】:

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

#define CHAR_ARRAY(MAX_LENGTH) struct CHAR_ARRAY_#MAX_LENGTHchar data[MAX_LENGTH]; int length;;

因此,仅使用上述宏,我就可以定义不同的数据类型,如下所示。

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

由于现有代码的特殊要求,需要用“struct”定义的普通旧类型,不使用std::array,vector等。特别是指针不被接受,因为我们的遗留代码有要求普通的旧类型,因此可以轻松处理分配或复制。

【问题讨论】:

你不能将字符指针与大小字段一起使用吗? 你试过了吗?顺便说一句,您可能正在寻找##,而不是# 在 C++ 中你应该只使用 std::array<char, 4> 它有一个 size() 方法。 @pepero 将# 更改为##,并从#define 行的末尾删除;。然后它会工作。 关于你的编辑,你提到你不能使用std::array,因为你需要一个POD类型:std::array<T, size>是一个POD,如果T是一个POD。 【参考方案1】:

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

#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 的糟糕重新实现,并且不只使用后者没有好处。

【讨论】:

@Richard OP 的问题/cmets 中没有任何内容表明这一点。事实上,这个问题似乎被错误地标记了,如果有的话。无论如何,该宏显然也适用于 C。 @RichardChambers 前两行是 C 编译的(它们应该)。既然他也将其标记为 C++,为什么不建议 C++ 答案呢?他从来没有说过为什么他不能使用 std::array 唯一明确的要求是“普通旧数据类型”,这与后来的编辑相矛盾,禁止使用std::array @2501 你可能在这里混淆了结构和联合吗? data 字段位于不同的命名空间中,即使在 C 中也是如此。 @2501 不,请参阅我之前的评论。没有没有冲突。

以上是关于在 C 或 C++ 中定义结构的宏的主要内容,如果未能解决你的问题,请参考以下文章

用于读取矩阵 C++ 的宏

C++学习(四九三)cmake的宏定义方式

C++学习(四九三)cmake的宏定义方式

如果数组大小发生变化以及定义的宏如何在此处计算偏移量,为啥 C 结构中的字符数组的偏移量会有所不同? [复制]

C语言中,宏替换的替换规则

C++中预定义的宏