我试图在递归宏/预处理器指令的帮助下生成下面给出的类。我不能使用模板,因为我正在构建类型(类)。宏用户必须能够创建此类而无需重复变量。我不想为变量使用容器,因为它们可以有有意义的名称。
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
来替换占位符?
我想知道这是否可行/推荐。
答案 0 :(得分:2)
这可能不是"答案"直接回答问题但实现了同样的目标。
宏一般是"邪恶"但有时可能有用。然而,在这里,它们仍然是邪恶的,因为后来使用该类的任何人都很难弄清楚它的实际定义,并且错误将更难以破译。
因此,建议使用脚本语言作为预构建步骤,该步骤可以读取类的配置并从中生成C ++文件。
然后,类的用户将看到看起来易于理解的实际C ++标头。
可以将Perl或Python用作脚本语言。我可能会选择Perl。 然后,您将使其成为预构建步骤。
生成的标题将是目标,脚本定义采用您决定的格式作为输入,因此make脚本将知道目标是否是最新的。
对于输入(类定义)文件,您可以使用XML或JSON格式,这两种格式都为您提供了具有重复组的嵌套键值对。无论你选择哪个都有
的优点