Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;宏';s标记粘贴器作为函数的参数_C++_Macros - Fatal编程技术网

C++ C++;宏';s标记粘贴器作为函数的参数

C++ C++;宏';s标记粘贴器作为函数的参数,c++,macros,C++,Macros,我在网上搜索了一段时间,不幸的是,我没有找到问题的答案或解决方案,事实上,假设我有两个函数,名称如下: 1) function1a(一些参数) 2) function2b(一些参数) 我想做的是编写一个宏,当输入正确的参数时,它可以识别这些函数,只是问题是,这个参数也应该是C/C++函数的参数,这是我到目前为止所做的 #define FUNCTION_RECOGNIZER(TOKEN) function##TOKEN() void function1a() { } void functi

我在网上搜索了一段时间,不幸的是,我没有找到问题的答案或解决方案,事实上,假设我有两个函数,名称如下:

1)
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);

这是一个定义的宏,但是类型不是一个被认可的预处理器符号,所以它被当作一个文字,预处理器不咨询C++分析器或者与它的AST树交互。 它参考了宏定义:

#define FUNCTION_RECOGNIZER(TOKEN) function##TOKEN()
参数literal
type
,被标记为
TOKEN
。单词
function
被视为一个文本并复制到结果字符串中,
##
告诉处理器复制结果字符串中的token
token
的值。由于
标记
不能识别为宏,因此
()
结束标记,
()
作为文本附加到结果字符串中

因此,预处理器代替

FUNCTION_RECOGNIZER(type);

所以坏消息是,没有办法去做你想做的事,但这可能是一个问题,也许有一个解决方案,你想做的事情


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

您应该使用函数重载而不是宏。只需给function1a和function1b取一个相同的名称:function1。我想避免重载,并在不使用它的情况下找到解决方案。对于这个任务,重载是自然的方式,必须使用。宏不适用于此,并且不能使用宏,因为宏不知道类型。您是否认为如果您调用另一个父函数(“1a”),那么您将最终调用
function1a()
,但是如果您调用另一个父函数(“2a”),您将最终调用
function2a()
?如果是这样,你就很容易误解C++预处理器的操作。这是一个运行时决策,预处理器无法对其进行编码-如果您使用包含用户提供的数据的变量而不是字符串文字,则更不能如此。@JonathanLeffler只要在编译时知道这些值,这是可能的。
functiontype();