gpt4 book ai didi

c++ - 为什么在这个宏中一个地方需要双磅而其他地方不需要?

转载 作者:行者123 更新时间:2023-11-30 03:29:52 24 4
gpt4 key购买 nike

在这段特殊的代码中,作者通过使用宏为 COUNTER 类的所有成员创建增量函数来巧妙地完成了一些工作。

class COUNTER
{
public:
UINT64 _call;
UINT64 _call_indirect;
UINT64 _return;
UINT64 _syscall;
UINT64 _branch;
UINT64 _branch_indirect;

COUNTER() : _call(0),_call_indirect(0), _return(0), _branch(0), _branch_indirect(0) {}

UINT64 Total()
{
return _call + _call_indirect + _return + _syscall + _branch + _branch_indirect;
}
};

COUNTER CountSeen;
COUNTER CountTaken;

#define INC(what) VOID inc ## what (INT32 taken) { CountSeen. what ++; if( taken) CountTaken. what ++;}

INC(_call)
INC(_call_indirect)
INC(_branch)
INC(_branch_indirect)
INC(_syscall)
INC(_return)

不过,我对宏有点困惑。为什么作者在宏的函数定义部分使用双磅,而不是在将其用作递增的类变量时使用?

编辑:我知道双磅号用于连接,但我的困惑来自为什么双磅号在 “CountSeen。什么++”和 “CountTaken。什么++”零件。

最佳答案

让我们看看第一个宏 (INC(_call)) 调用扩展为:

VOID inc_call (INT32 taken) { CountSeen. _call ++; if( taken) CountTaken. _call ++;}

重新格式化一下,我们得到:

VOID inc_call (INT32 taken) {
CountSeen._call++;
if(taken)
CountTaken._call++;
}

这声明了一个函数 inc_call,它递增 CountSeen._call 并且可能还有 CountTaken._call。由于变量未被称为 ._call(这是一个无效的标记,因为您不能以句点开头的名称),句点不应粘在宏参数上。类似地,由于 _call++ 不是有效的标记(它是两个标记;您不能在名称中包含加号),因此那里不应该有井号。

但是,如果没有第一个 ##,结果将开始 VOID inc _call (INT32 taken),这也是无效的 C++,因为它有两个函数名称。

关于c++ - 为什么在这个宏中一个地方需要双磅而其他地方不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45361207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com