C++ 中的奇怪定义预处理器
我遇到过这个
#define DsHook(a,b,c) if (!c##_) { INT_PTR* p=b+*(INT_PTR**)a; VirtualProtect(&c##_,4,PAGE_EXECUTE_READWRITE,&no); *(INT_PTR*)&c##_=*p; VirtualProtect(p,4,PAGE_EXECUTE_READWRITE,&no); *p=(INT_PTR)c; }
,除了“c##_”这个词之外,一切都很清楚,这是什么意思?
I've come across this
#define DsHook(a,b,c) if (!c##_) { INT_PTR* p=b+*(INT_PTR**)a; VirtualProtect(&c##_,4,PAGE_EXECUTE_READWRITE,&no); *(INT_PTR*)&c##_=*p; VirtualProtect(p,4,PAGE_EXECUTE_READWRITE,&no); *p=(INT_PTR)c; }
and everything is clear except the "c##_" word, what does that mean?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
它的意思是“粘合”在一起,因此
c
和_
“粘合”在一起形成c_
。这种粘合发生在宏中的参数替换之后。看我的例子:It means to "glue" together, so
c
and_
get "glued together" to formc_
. This glueing happens after argument replacement in the macro. See my example:它被称为令牌粘贴运算符。示例:
输出
It is called a token-pasting operator. Example:
Output
这是将下划线附加到作为
c
传递的名称的串联。所以当你使用该部分时就会变成
That's concatenation that appends an underscore to the name passed as
c
. So when you usethat part turns into
在预处理器之后,您的宏将扩展为:
## 指令将您作为宏参数传递给 _ 的 c 值连接起来
After the preprocessor, your macro will be expanded as:
The ## directive concatenates the value of c which you pass as a macro parameter to _
简单的一个:
在调用站点:
将扩展为:
Simple one:
At call site:
Would expand as:
它称为 Token Concatenation,用于在预处理期间连接 token
例如,以下代码将打印出 c、c_、c_spam 的值:
输出:
It is called Token Concatenation and it is used to concatenate tokens during the preprocessing
For example the following code will print out the values of the values of c, c_, c_spam:
Output: