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

时间:2014-07-26 04:58:16

标签: c++ macros boost-preprocessor

我试图通过使用宏来定义顶点基础并使宏最终生成与OpenGL(glGetAttribLocationglEnableVertexAttribArray一起使用所需的样板代码,从而在OpenGL中创建顶点结构, 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宏了,因为我从来没有真正有理由使用它们或者知道是什么让它们一直打到现在。

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

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

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

正如您已经发现的那样,C宏很笨拙且难以调试。我宁愿编写一个脚本(例如,在Python中,但任何具有良好开发的字符串处理功能的脚本语言都可以),它将输出包含opengl_boilerplate.h声明的struct文件。然后,您将在构建软件时调用此脚本。我不知道如何使用VS2013,但是运行一次就足够了(取决于你的项目)。