#define TYPE_CHECK(T, S) \
while (false) { \
*(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \
}
Run Code Online (Sandbox Code Playgroud)
我正在阅读谷歌v8的代码,发现上面的宏进行类型检查.
但是,我不明白为什么会这样.虽然(假)永远不会被执行,对吧?有人可以解释这些线吗?谢谢
人们总是说宏是不安全的,而且它们不是(直接)对其参数进行类型检查,等等.更糟糕的是:当发生错误时,编译器会给出内在和难以理解的诊断,因为宏只是一团糟.
是否有可能以与函数几乎相同的方式使用宏,通过安全的类型检查,避免典型的陷阱以及编译器提供正确诊断的方式.
让我们快速记住宏生成的一些典型陷阱.
例1
#define SQUARE(X) X*X
int i = SQUARE(1+5);
Run Code Online (Sandbox Code Playgroud)
预期值i:36.真值i:11(宏观扩展:) 1+5*1+5.陷阱!
(典型)解决方案(例2)
#define SQUARE(X) (X)*(X)
int i = (int) SQUARE(3.9);
Run Code Online (Sandbox Code Playgroud)
预期价值i:15.真实价值i:11(宏观扩张后:(int) (3.9)*(3.9)).陷阱!
(典型)解决方案(例3)
#define SQUARE(X) ((X)*(X))
Run Code Online (Sandbox Code Playgroud)
它适用于整数和浮点数,但它很容易被破坏:
int x = 2;
int i = SQUARE(++x);
Run Code Online (Sandbox Code Playgroud)
预期值i:9(因为(2+1)*(2+1)...).真值i:12(宏扩展:((++x)*(++x)),给出3*4).陷阱!
在这里可以找到一种很好的宏检查方法:
但是我想要更多:某种界面或"标准"语法,以及(少量)易于记忆的规则.意图是"能够使用(不实现)宏"与尽可能类似的功能.这意味着:写得好的假函数.
为什么在某种程度上有趣?
我认为这是在C中实现的一个有趣的挑战. …