作者:AJlf100斤的好奇心心宜1993 | 来源:互联网 | 2023-07-10 12:39
我在C ++中有这个特殊的宏功能:
您能告诉我这是怎么工作的吗?
#define EXAMPLE(obje) (::f(s,(obje),arg1,arg2,arg3))
我有几个问题:
1)::f
是什么意思?编译器在哪里搜索函数f
?
2)(obje)
是什么意思?为什么在括号之间?
::f(...)
-调用函数f
仅搜索全局范围(避免参数依赖查询)。 (假设f
是一个函数)。
(obje)
-obje
,带有括号。取决于obje
是什么。避免obje
扩展宏时产生奇怪效果的典型宏技巧。
,
1):: f是什么意思?
::
是范围解析运算符。 f
通常是标识符。 ::f
是完全限定名称,它引用全局命名空间中的f
。
编译器在哪里搜索函数f?
在全局名称空间中查找
f
。
2)(obje)是什么意思?
obje
是类似于宏的函数的参数。它将替换为作为参数传递的文本。
为什么在括号之间?
宏参数周围的括号可确保它在语法上是单个表达式。在许多宏中,在参数周围缺少括号会导致某些输入产生意外结果。
我不知道该宏是否可以在没有括号的情况下输入有问题的内容,但是按惯例,使用它们比猜测是否存在问题更安全,并且此类约定通常由样式检查器强制执行。