gpt4 book ai didi

c++ - 为什么 C 宏不是类型安全的?

转载 作者:IT老高 更新时间:2023-10-28 21:37:38 25 4
gpt4 key购买 nike

如果遇到此 claim multiple times并且无法弄清楚它应该是什么意思。由于生成的代码是使用常规 C 编译器编译的,因此最终会像任何其他代码一样多(或少)进行类型检查。

那么为什么宏不是类型安全的?这似乎是他们应该被视为邪恶的主要原因之一。

最佳答案

考虑典型的“max”宏与函数:

#define MAX(a,b) a < b ? a : b
int max(int a, int b) {return a < b ? a : b;}

当人们说宏在函数的方式上不是类型安全的时,这就是人们的意思:

如果函数的调用者写入

char *foo = max("abc","def");

编译器会发出警告。

然而,如果宏的调用者写道:

char *foo = MAX("abc", "def");

预处理器会将其替换为:

char *foo = "abc" < "def" ? "abc" : "def";

这将毫无问题地编译,但几乎可以肯定不会给出您想要的结果。

另外当然副作用不同,考虑函数情况:

int x = 1, y = 2;
int a = max(x++,y++);

max() 函数将对 x 和 y 的原始值进行操作,并且后增量将在函数返回后生效。

在宏观情况下:

int x = 1, y = 2;
int b = MAX(x++,y++);

第二行被预处理以给出:

int b = x++ < y++ ? x++ : y++;

同样,没有编译器警告或错误,但不会是您预期的行为。

关于c++ - 为什么 C 宏不是类型安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17970627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com