Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.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++_Macros_Boost Preprocessor - Fatal编程技术网

C++ 从可变宏参数创建成员

C++ 从可变宏参数创建成员,c++,macros,boost-preprocessor,C++,Macros,Boost Preprocessor,我试图在OpenGL中创建顶点结构,方法是使用宏来定义顶点基础,并让宏最终生成OpenGL所需的样板代码(glGetAttribLocation,glEnableVertexAttribArray,glVertexAttribPointer等) 我的宏定义如下: #define DEFINE_GPU_VERTEX_ATTRIBUTE(R, DATA, ELEM) BOOST_PP_CAT(ELEM, DATA); #define DEFINE_GPU_VERTEX(NAME, ...) str

我试图在OpenGL中创建顶点结构,方法是使用宏来定义顶点基础,并让宏最终生成OpenGL所需的样板代码(
glGetAttribLocation
glEnableVertexAttribArray
glVertexAttribPointer
等)

我的宏定义如下:

#define DEFINE_GPU_VERTEX_ATTRIBUTE(R, DATA, ELEM) BOOST_PP_CAT(ELEM, DATA);

#define DEFINE_GPU_VERTEX(NAME, ...) struct NAME##_gpu_vertex_t \
{ \
    BOOST_PP_SEQ_FOR_EACH(DEFINE_GPU_VERTEX_ATTRIBUTE, _, __VA_ARGS__) \
}
这是我打算如何使用宏的示例:

DEFINE_GPU_VERTEX(bsp,
((vec3_t), position),
((vec3_t), normal),
((vec2_t), texcoord));
其中第一个参数(
bsp
)是名称前缀,所有可变参数都是属性的类型和名称对

我希望它能生成如下结构定义:

struct bsp_gpu_vertex_t
{
    vec3_t position;
    vec3_t normal;
    vec2_t texcoord;
}
但是,它似乎生成了一个空结构。我做错了什么

我不熟悉C宏,更不用说Boost宏了,因为我从来没有真正的理由使用它们,也没有真正了解到是什么让它们运行至今


感谢您的帮助

警告:这可能无法回答您原来的问题。这甚至不是一个答案,而是一个问题:

您是否考虑过使用高级语言而不是C宏生成这些结构


正如您已经发现的,C宏非常笨拙,而且很难调试。我更愿意编写一个脚本(比如,用Python编写,但任何具有良好字符串处理功能的脚本语言都可以),输出一个包含
struct
声明的
opengl\u boilerplate.h
文件。然后在构建软件时调用此脚本。我不知道如何使用VS2013实现这一点,但也许运行一次就足够了(取决于您的项目)。

获取预处理的表单(例如,使用
g++-C-e
,或者适当地使用编译器和IDE),然后使用编辑器或寻呼机查看内部(例如
less
)。另外,请说明您使用的编译器和操作系统,以及您的编译命令。我使用的是Visual Studio 2013。
BOOST\u PP**SEQ**FOR\u每个
都需要一个,而您没有提供一个。有一种方法可以将可变数据转换为seq,这可能会有所帮助。我认为,实现这一点的“通常”方法(至少是在结构的融合适应/定义中使用的方法)是直接使用序列。中的第二和第三种方法可能会有所帮助。这是一个有趣的想法,但它有一些我不想发生的事情。首先,它创建了一个依赖关系,依赖于在编译它的机器上安装Python。它还增加了另一个构建步骤,可以通过使用我最初计划的宏来避免。是的,这些是要考虑的有效点。FWWW,我总是使用CMake()来构建我的C++项目,它可以用于这种头文件生成,可能会更少麻烦。该项目无论如何都取决于CMake,额外的构建步骤由CMake“免费”完成。它可以生成VS项目。也许你也可以看看这个选项。