在 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++ 中定义结构的宏的主要内容,如果未能解决你的问题,请参考以下文章