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

标签 c++ c types macros

如果遇到此 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/

相关文章:

c++ - DwmIsCompositionEnabed 不存在于 afxglobals.h 中

c - 冗余分配消除是相当典型的优化吗?

c# - .NET:如何检查泛型类中的类型?

sql - 复合类型的多个插入

c++ - 二叉搜索树 - 复制树

c++ - 完成后如何在不运行exe文件的情况下编译项目?

c++ - STL列表-[intNumber]的作用是什么?

c - 嵌套 while 循环在 C 中不起作用

c - 什么会导致程序忽略用户的输入

c++ - 字符数组队列