可能重复:
C中##预处理器的用途是什么
来自Google TTS的趣味...... 任何人都可以了解这段代码是如何运作的?特别是 - 什么样的符号是"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;
Run Code Online (Sandbox Code Playgroud)
它在代码中展开为 -
// redirect 7th member func of IAsyncReader (SyncReadAlligned) to grab mp3 data from output pin of source filter
DsHook(reader,6,SyncReadAlligned);
Run Code Online (Sandbox Code Playgroud)
我想,这不是一种非常安全的内存播放方式,但作者称其为"不重要":
像钩子这样的不重要的代码以代码段的形式折叠,但随意展开并以您喜欢的方式格式化代码.
PS如果Google已经阻止了"Google with Fun"本身(如果有人有兴趣测试的话).
更新:我认为,简短的分析是 - 要"重定向IAsyncReader的第7个成员函数(SyncReadAlligned)以从源过滤器的输出引脚获取mp3数据",我们更改了已提交页面的某些区域的内存保护"是"到PAGE_EXECUTE_READWRITE(允许完全访问).
关于安全MSDN说 -
最好避免使用VirtualProtect更改由GlobalAlloc,HeapAlloc或LocalAlloc分配的内存块上的页面保护,因为单个页面上可以存在多个内存块....在保护可执行区域时,调用程序负责确保缓存一致性......
小智 5
它是一个预处理器指令,意思是"连接".c##_将生成一个包含参数c和文字字符的替换值的标记_.例:
#define foo(c) c##_
Run Code Online (Sandbox Code Playgroud)
当使用时foo(bar),这将扩展为bar_.
| 归档时间: |
|
| 查看次数: |
240 次 |
| 最近记录: |