文春的回答
开洞就是靠编译器实现用户自己写代码几乎不可能实现的功能。
比如 `__LINE__` 这个宏,用来表示当前行数。
如果让用户自己写,自己定义这个宏,几乎无法实现这个功能,但是编译器可以轻松实现:编译时肯定要读取源码啊,那这是__LINE__出现在第几行不是轻松知道?
于是就在编译器里规定:保留“__LINE__”宏名,不能由用户定义,当用户使用__LINE__这个宏时,替换成当前代码行数。
开洞就是靠编译器实现用户自己写代码几乎不可能实现的功能。
比如 `__LINE__` 这个宏,用来表示当前行数。
如果让用户自己写,自己定义这个宏,几乎无法实现这个功能,但是编译器可以轻松实现:编译时肯定要读取源码啊,那这是__LINE__出现在第几行不是轻松知道?
于是就在编译器里规定:保留“__LINE__”宏名,不能由用户定义,当用户使用__LINE__这个宏时,替换成当前代码行数。