具有预处理器指令的C ++类生成

时间:2014-09-10 09:52:56

标签: c++ c-preprocessor

我试图在递归宏/预处理器指令的帮助下生成下面给出的类。我不能使用模板,因为我正在构建类型(类)。宏用户必须能够创建此类而无需重复变量。我不想为变量使用容器,因为它们可以有有意义的名称。

class IInterface;

class XYZ
{
      int Mark1, Mark2, Mark3 /* variables to be passed */;
      int count;
      XYZ(IInterface * I) 
      {
            count = 0;
            // initialization values to be passed
            Mark1 = 10; count++; I -> add(Mark1);
            Mark2 = 20; count++; I -> add(Mark2);
            Mark3 = 30; count++; I -> add(Mark3);

      }
};

我试图放置占位符,然后展开它们。

#define CLASS(_name) class _name {\
    int VARS; \
      int count; \
      _name(IInterface * I) \
      { \
            count = 0; \
            VAR = val; count++; I -> add(VAR); \
      } \
};

#define INIT // expansion code

CLASS(XYZ)
INIT(Mark1, 10) // variables should be sent only once for all the placeholders
INIT(Mark2, 20)
INIT(Mark3, 30)

如何展开INIT来替换占位符? 我想知道这是否可行/推荐。

1 个答案:

答案 0 :(得分:2)

这可能不是"答案"直接回答问题但实现了同样的目标。

宏一般是"邪恶"但有时可能有用。然而,在这里,它们仍然是邪恶的,因为后来使用该类的任何人都很难弄清楚它的实际定义,并且错误将更难以破译。

因此,建议使用脚本语言作为预构建步骤,该步骤可以读取类的配置并从中生成C ++文件。

然后,类的用户将看到看起来易于理解的实际C ++标头。

可以将Perl或Python用作脚本语言。我可能会选择Perl。 然后,您将使其成为预构建步骤。

生成的标题将是目标,脚本定义采用您决定的格式作为输入,因此make脚本将知道目标是否是最新的。

对于输入(类定义)文件,您可以使用XML或JSON格式,这两种格式都为您提供了具有重复组的嵌套键值对。无论你选择哪个都有

的优点
  • 它们是众所周知的格式,可供需要阅读或编写的开发人员理解
  • 已经有解析它们的代码,因此您不需要编写实际的解析器,而只需使用解析后的数据来生成输出文件。