Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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或C++;_C++_C_Macros_C Preprocessor - Fatal编程技术网

C++ 宏来定义C或C++;

C++ 宏来定义C或C++;,c++,c,macros,c-preprocessor,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、v

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

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

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

#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; };
模板
结构字符数组{char data[N];std::size\u t length;};
然后将元素类型设为泛型:

template <typename T, std::size_t N>
struct array { T data[N]; std::size_t length; };
模板
结构数组{T data[N];std::size\u T length;};

…现在这一点变得非常明显,这是对
std::array
的一个糟糕的重新实现,而且不只是使用后者有好处。

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

#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; };
模板
结构字符数组{char data[N];std::size\u t length;};
然后将元素类型设为泛型:

template <typename T, std::size_t N>
struct array { T data[N]; std::size_t length; };
模板
结构数组{T data[N];std::size\u T length;};


…现在,这一点变得非常明显,这是对
std::array
的一个糟糕的重新实现,并且不仅仅使用后者没有任何好处。

您不能将字符指针与大小字段一起使用吗?您试过了吗?顺便说一下,你可能在寻找< C++ >代码> >代码> < <代码> >。在C++中,你应该只使用<代码> STD::数组< /COD> >它有<代码> siz()/<代码>方法。@ PePeo更改<代码> < <代码> > < > > > <代码>,删除<代码>;代码>从
#define
行的末尾开始。然后就可以了。关于你提到的编辑,你不能使用
std::array
,因为你需要一个POD类型:
std::array
是一个POD,如果
t
是一个POD。你不能将字符指针和大小字段一起使用吗?你试过了吗?顺便说一下,你可能在寻找< C++ >代码> >代码> < <代码> >。在C++中,你应该只使用<代码> STD::数组< /COD> >它有<代码> siz()/<代码>方法。@ PePeo更改<代码> < <代码> > < > > > <代码>,删除<代码>;代码>从
#define
行的末尾开始。然后它就会起作用。关于你提到的编辑,你不能使用
std::array
,因为你需要一个POD类型:
std::array
是一个POD,如果
t
是一个POD。@Richard OP的问题/评论中没有任何内容表明这一点。事实上,这个问题似乎被错误地贴上了标签。无论如何,宏显然也适用于C。@RichardChambers前两行是C-Compileant(应该)。既然他也把它标记为C++,为什么不建议C++回答呢?他从未说过为什么他不能使用std::array唯一明确的要求是“简单的旧数据类型”,后者的编辑禁止使用
std::array
@2501,这与后者的编辑相矛盾。你可能在这里混淆了结构和联合吗?
数据
字段位于不同的名称空间中,即使在C中也是如此。@2501否,请参见我之前的评论。没有冲突。@Richard OP的问题/评论中没有任何内容表明这一点。事实上,这个问题似乎被错误地贴上了标签。无论如何,宏显然也适用于C。@RichardChambers前两行是C-Compileant(应该)。既然他也把它标记为C++,为什么不建议C++回答呢?他从未说过为什么他不能使用std::array唯一明确的要求是“简单的旧数据类型”,后者的编辑禁止使用
std::array
@2501,这与后者的编辑相矛盾。你可能在这里混淆了结构和联合吗?
数据
字段位于不同的名称空间中,即使在C中也是如此。@2501否,请参见我之前的评论。没有冲突。