我一直在问这个问题,但我从来没有得到过一个真正好的答案;我想几乎每个程序员在写第一个"Hello World“之前都遇到过”宏永远不应该被使用“、”宏是邪恶的“之类的短语,我的问题是:为什么?有了新的C++11,这么多年后有没有真正的替代品?
容易的部分是关于像#pragma这样的宏,它们是特定于平台和特定于编译器的,大多数时候它们都有像#pragma once这样的严重缺陷,在至少两个重要的情况下很容易出错:在不同的路径中有相同的名称,并且有一些网络设置和文件系统。
但总的来说,宏和它们的用法的替代方案呢?
发布于 2012-12-26 21:49:23
一个常见的问题是:
#define DIV(a,b) a / b
printf("25 / (3+2) = %d", DIV(25,3+2));它将打印10,而不是5,因为预处理器会这样展开它:
printf("25 / (3+2) = %d", 25 / 3 + 2);此版本更安全:
#define DIV(a,b) (a) / (b)发布于 2012-12-26 21:55:54
我不认为使用预处理器定义或宏有任何错误。
它们是在c/c++中发现的(元)语言概念,就像任何其他工具一样,如果你知道自己在做什么,它们可以让你的生活变得更容易。宏的问题是,它们在c/c++代码之前被处理,并生成新的代码,这些代码可能会出错,并导致编译器错误,这些错误几乎是显而易见的。好的一面是,如果使用得当,它们可以帮助您保持代码的整洁,并节省大量的输入,因此这取决于个人喜好。
发布于 2015-07-05 03:36:15
C/C++中的宏可以作为版本控制的重要工具。只需对宏进行较小的配置,就可以将相同的代码交付给两个客户端。我使用像这样的东西
#define IBM_AS_CLIENT
#ifdef IBM_AS_CLIENT
#define SOME_VALUE1 X
#define SOME_VALUE2 Y
#else
#define SOME_VALUE1 P
#define SOME_VALUE2 Q
#endif如果没有宏,这种功能就不那么容易实现了。宏实际上是一个很棒的软件配置管理工具,而不仅仅是一种创建代码重用快捷方式的方法。在宏中定义函数以实现可重用性肯定会产生问题。
https://stackoverflow.com/questions/14041453
复制相似问题