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

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

#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等。特别是指针不被接受,因为我们的遗留代码有要求普通的旧类型,因此可以轻松处理分配或复制。

【问题讨论】:

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

标签: c++ c macros c-preprocessor


【解决方案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 不,请参阅我之前的评论。没有没有冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
  • 2012-10-20
相关资源
最近更新 更多