知乎热榜 ( ) • 2024-04-22 22:41
文春的回答

开洞就是靠编译器实现用户自己写代码几乎不可能实现的功能。

比如 `__LINE__` 这个宏,用来表示当前行数。

如果让用户自己写,自己定义这个宏,几乎无法实现这个功能,但是编译器可以轻松实现:编译时肯定要读取源码啊,那这是__LINE__出现在第几行不是轻松知道?

于是就在编译器里规定:保留“__LINE__”宏名,不能由用户定义,当用户使用__LINE__这个宏时,替换成当前代码行数。

Compiler Explorer - C++ (x64 msvc v19.38)