我在网上搜索了一段时间,不幸的是我没有找到答案或解决我的问题,事实上,让我说我有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的参数,我问是否存在一个技巧或任何东西来执行这种粘贴方式。
提前谢谢你:)
答案 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,也许是你想要实现的目标的解决方案。
例如,可以根据参数类型重载函数,或者根据参数专门化模板函数,或者可以根据参数值创建查找表。