C++ C++;宏';s标记粘贴器作为函数的参数
我在网上搜索了一段时间,不幸的是,我没有找到问题的答案或解决方案,事实上,假设我有两个函数,名称如下: 1)C++ C++;宏';s标记粘贴器作为函数的参数,c++,macros,C++,Macros,我在网上搜索了一段时间,不幸的是,我没有找到问题的答案或解决方案,事实上,假设我有两个函数,名称如下: 1) function1a(一些参数) 2) function2b(一些参数) 我想做的是编写一个宏,当输入正确的参数时,它可以识别这些函数,只是问题是,这个参数也应该是C/C++函数的参数,这是我到目前为止所做的 #define FUNCTION_RECOGNIZER(TOKEN) function##TOKEN() void function1a() { } void functi
function1a(一些参数)
2) function2b(一些参数)
我想做的是编写一个宏,当输入正确的参数时,它可以识别这些函数,只是问题是,这个参数也应该是C/C++函数的参数,这是我到目前为止所做的
#define FUNCTION_RECOGNIZER(TOKEN) function##TOKEN()
void function1a()
{
}
void function2a()
{
}
void anotherParentFunction(const char* type)
{
FUNCTION_RECOGNIZER(type);
}
显然,宏正在识别“functiontype”并忽略另一个parentfunction的参数,我在问是否有/存在某种技巧或任何东西来执行这种粘贴方式
提前感谢:)如果您坚持使用宏:跳过另一个parentfunction()函数,直接使用宏。当使用常量字符串调用时,即
FUNCTION_RECOGNIZER( "1a");
它应该会起作用
一个更类似C++的解决方案是使用EnUM,然后用EnUM作为参数和调用相应函数的开关来实现另一个PARTANCE函数()。当然,每次添加新函数时都需要更改enum和switch语句,但是在选择函数名称时会更加灵活
有更多的解决方案可以实现类似的目标,问题是:您的用例是什么?您希望实现什么?在16.1.5中,标准规定: 该实现可以有条件地处理和跳过源文件的部分,包括其他源文件,并替换宏。这些功能称为预处理,因为从概念上讲,它们发生在生成的翻译单元的翻译之前 [我的重点] 最初,预处理是由一个单独的应用程序完成的,它本质上是一种独立的语言 今天,预处理器通常是编译器的一部分,但是-例如-在Clang AST树中看不到宏等 这一点的意义在于,预处理器对类型、函数或参数一无所知 你的函数定义
void anotherParentFunction(const char* type)
对预处理器来说没有任何意义,并且被预处理器完全忽略
FUNCTION_RECOGNIZER(type);
这是一个定义的宏,但是
#define FUNCTION_RECOGNIZER(TOKEN) function##TOKEN()
参数literaltype
,被标记为TOKEN
。单词function
被视为一个文本并复制到结果字符串中,##
告诉处理器复制结果字符串中的tokentoken
的值。由于标记
不能识别为宏,因此()
结束标记,()
作为文本附加到结果字符串中
因此,预处理器代替
FUNCTION_RECOGNIZER(type);
与
所以坏消息是,没有办法去做你想做的事,但这可能是一个问题,也许有一个解决方案,你想做的事情
例如,可以基于参数类型重载函数,或者基于参数专门化模板函数,或者可以基于参数值创建查找表。您应该使用函数重载而不是宏。只需给function1a和function1b取一个相同的名称:function1。我想避免重载,并在不使用它的情况下找到解决方案。对于这个任务,重载是自然的方式,必须使用。宏不适用于此,并且不能使用宏,因为宏不知道类型。您是否认为如果您调用另一个父函数(“1a”),那么您将最终调用
function1a()
,但是如果您调用另一个父函数(“2a”),您将最终调用function2a()
?如果是这样,你就很容易误解C++预处理器的操作。这是一个运行时决策,预处理器无法对其进行编码-如果您使用包含用户提供的数据的变量而不是字符串文字,则更不能如此。@JonathanLeffler只要在编译时知道这些值,这是可能的。
functiontype();