使用另一个宏生成宏的名称(c预处理器)

时间:2015-02-04 17:31:34

标签: c++ c macros c-preprocessor

我可以使用取自C pre-processor defining for generated function names

的宏为函数生成名称
#define POSTFIX _ABC //_ABC should be mentioned only there
#define PROTOTYPENAME(symbol) symbol ## POSTFIX
#define PROTOTYPENAMED(sym) PROTOTYPENAME(sym)

int PROTOTYPENAMED(Function)(int a, int b, int c);

以上结果为

int Function_ABC(int a, int b, int c);

如果我想为#define ANOTHERFUNCTION_ABC WhatsThat()生成等价物,我可能想写

#define PROTOTYPENAMED(ANOTHERFUNCTION) WhatsThat()

但这将重新定义PROTOTYPENAMED宏。有没有办法在没有到处写_ABC的情况下正确地做到这一点?

PS。我正在使用Visual Studio 2013,代码应该在C和C ++中工作。

编辑: alk:这个问题包含了如何使用其他工具做更多有用的答案。你不应该把这个问题标记为dublicate。

编辑2: 我在考虑不需要外部工具的替代品。也许不需要将它声明为宏?如果我们假设WhatsThat()正在返回int,则不会禁止写int PROTOTYPENAMED(ANOTHERFUNCTION) = WhatsThat();

1 个答案:

答案 0 :(得分:3)

标准C / C ++预处理器不可行。但是,您可以使用某些C ++或C源生成器来提供编译器,例如, GPPGNU m4预处理器或某些脚本-e.g.在Python中,awkguile,......(或程序)属于你。

例如,yaccbisonANTLR会生成C ++代码。并且MELT被编译成C ++代码。

当然,您需要相应地配置构建器,例如添加更多GNU make规则。