首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么预处理器宏是邪恶的?有什么替代方案?

为什么预处理器宏是邪恶的?有什么替代方案?
EN

Stack Overflow用户
提问于 2012-12-26 21:44:52
回答 4查看 53.6K关注 0票数 105

我一直在问这个问题,但我从来没有得到过一个真正好的答案;我想几乎每个程序员在写第一个"Hello World“之前都遇到过”宏永远不应该被使用“、”宏是邪恶的“之类的短语,我的问题是:为什么?有了新的C++11,这么多年后有没有真正的替代品?

容易的部分是关于像#pragma这样的宏,它们是特定于平台和特定于编译器的,大多数时候它们都有像#pragma once这样的严重缺陷,在至少两个重要的情况下很容易出错:在不同的路径中有相同的名称,并且有一些网络设置和文件系统。

但总的来说,宏和它们的用法的替代方案呢?

EN

回答 4

Stack Overflow用户

发布于 2012-12-26 21:49:23

一个常见的问题是:

代码语言:javascript
复制
#define DIV(a,b) a / b

printf("25 / (3+2) = %d", DIV(25,3+2));

它将打印10,而不是5,因为预处理器会这样展开它:

代码语言:javascript
复制
printf("25 / (3+2) = %d", 25 / 3 + 2);

此版本更安全:

代码语言:javascript
复制
#define DIV(a,b) (a) / (b)
票数 14
EN

Stack Overflow用户

发布于 2012-12-26 21:55:54

我不认为使用预处理器定义或宏有任何错误。

它们是在c/c++中发现的(元)语言概念,就像任何其他工具一样,如果你知道自己在做什么,它们可以让你的生活变得更容易。宏的问题是,它们在c/c++代码之前被处理,并生成新的代码,这些代码可能会出错,并导致编译器错误,这些错误几乎是显而易见的。好的一面是,如果使用得当,它们可以帮助您保持代码的整洁,并节省大量的输入,因此这取决于个人喜好。

票数 3
EN

Stack Overflow用户

发布于 2015-07-05 03:36:15

C/C++中的宏可以作为版本控制的重要工具。只需对宏进行较小的配置,就可以将相同的代码交付给两个客户端。我使用像这样的东西

代码语言:javascript
复制
#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

如果没有宏,这种功能就不那么容易实现了。宏实际上是一个很棒的软件配置管理工具,而不仅仅是一种创建代码重用快捷方式的方法。在宏中定义函数以实现可重用性肯定会产生问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14041453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档