C ++ Macro的Token-Paster作为函数的参数

时间:2016-09-28 04:16:39

标签: c++ macros

我在网上搜索了一段时间,不幸的是我没有找到答案或解决我的问题,事实上,让我说我有2个这样命名的函数:

1)function1a(some_args)

2)function2b(some_args)

我想要做的是编写一个可以在使用正确的参数时识别这些函数的宏,就是这个,这个参数也应该是C / C ++函数的参数,这就是我做的到目前为止。

 #define FUNCTION_RECOGNIZER(TOKEN) function##TOKEN()

void function1a() 
{

}
void function2a() 
{
}

void anotherParentFunction(const char* type)
{
    FUNCTION_RECOGNIZER(type);
}
很明显,宏正在识别" functiontype"并忽略anotherParentFunction的参数,我问是否存在一个技巧或任何东西来执行这种粘贴方式。

提前谢谢你:)

2 个答案:

答案 0 :(得分:0)

如果你坚持使用宏:跳过anotherParentFunction()函数并直接使用宏。用常量字符串调用时,即

FUNCTION_RECOGNIZER( "1a");

它应该有用。

更像C ++的解决方案是使用枚举,然后使用enum作为参数实现anotherParentFunction(),并调用相应函数的开关。当然,每次添加新函数时都需要更改枚举和switch语句,但是在选择函数名称时会更灵活。

还有更多解决方案可以实现类似的功能,问题是:您的用例是什么?想要实现什么目标?

答案 1 :(得分:0)

在16.1.5中,标准说:

  

实现可以有条件地处理和跳过源文件的各个部分,包括其他源文件和替换宏。 这些功能称为预处理,因为从概念上讲它们是在翻译生成的翻译单元之前发生的。

[强调我的]

最初的预处理是由一个单独的应用程序完成的,它本质上是一种独立的语言。

今天,预处理器通常是编译器的一部分,但是 - 例如 - 你不能在Clang AST树中看到宏等。

这一点的重要性在于预处理器对类型,函数或参数一无所知。

您的功能定义

void anotherParentFunction(const char* type)

对预处理器没有任何意义,并且被它完全忽略。

FUNCTION_RECOGNIZER(type);

这被识别为已定义的宏,但type不是可识别的预处理器符号,因此它被视为文字,预处理器不会参考C ++解析器或者与它的AST树互动。

它参考宏观定义:

#define FUNCTION_RECOGNIZER(TOKEN) function##TOKEN()

参数{literal type被标记为TOKEN。单词function被视为文字并复制到结果字符串,##告诉处理者按字面意义复制标记TOKEN的值,生成functiontype结果字符串。由于TOKEN未被识别为宏,因此()结束令牌,()作为文字附加到结果字符串。

因此,预处理器替代

FUNCTION_RECOGNIZER(type);

functiontype();

所以坏消息是,没有办法做你想做的事情,但这可能是一个XY Problem,也许是你想要实现的目标的解决方案。

例如,可以根据参数类型重载函数,或者根据参数专门化模板函数,或者可以根据参数值创建查找表。