c++中用define宏定义是落后的方式么

【c++中用define宏定义是落后的方式么】 用来刷逼格啊,有些个程序猿童鞋总是觉得工具越落后、代码越“底层”代表越牛逼,如果能成天对着个硬件串行接口写写IO移移buffer就是最牛逼的猿,你宏飞满天他们会把你当大神的,嗯。最好把C++代码写得只能用C++编译器编译但却比C生产力更低下,你就是这群人眼中的底层大神了(望天

■网友
是。而且不仅仅是在作用域方面。
constexpr, typedef/using, inline, enum可以替代绝大部分宏。
宏的缺点:
容易出错。比如#define PLUS(a) ((a)+(a)) 然后调用的时候用PLUS(a++)没有命名空间,容易冲突(比如经常冲突MAX, MIN)在预处理期就被处理了,编译出错后难以修复。宏的一些合理用途:
include guard(#ifndef XXX #define XXX #endif)编译开关(比如NDEBUG宏控制assert表达式是否被计算)
■网友
答:我觉得并不是。

■网友
我认为是的。
因为 #define 不被视为语言的一部分,这才是问题所在。举一个简单的例子:
#define MAX 100
记号名称 MAX从未被编译器看见,因为在编译器处理源代码之前它已经被预处理器移走了,于是符号MAX有可能没有进入符号表中。在你运用次常量但带来编译错误时可能会比较费解,因为错误信息会提到100而不是MAX。 如果MAX被定义在一个头文件中,而且这个头文件也不是你写,那么就跟麻烦了,你可能对MAX来自何处完全没有概念,这样可能会大大加大调试的难度。
而对于作用域而言,#define并不重视作用域,一旦宏被定义,它就在其后的编译过程中有效,除非在之后某处使用#undef,所以宏定义并不能提供任何的封装性。
而且宏定义有可能带来一些意想不到的bug,程序的行为跟你的设想完全不同,增加调试的难度,比如下面这个例子:
#define MAX(lhs, rhs) (lhs) \u0026gt; (rhs) ? (lhs): rhs
int t1 = 10, t2 = 3;
MAX(++t1, t2)
此时t1会被递增两次,这有可能并不是你想要,但这个副作用却很难被发现。

■网友
能用template,inline啥的还用宏当然是落后。但是当有些地方宏不可取代的时候就不是了。比如跨平台的时候控制条件编译,批量生产重复代码(例如处理中断)啥的。

■网友
见过有傻逼#define T的,然后所有的template都闹鬼了

■网友
确实是落后的方式。目前的趋势是语言越来越往更高层次进行抽象,越来越安全和简洁,越来越符合人的思维习惯。C++的这种琐碎的特性相对来说是落后的。
■网友
?ω?并不懂c++啊啊啊。不过,C中预处理命令#define有些功能是它们取代不了的。个人的感触特别是在有文件作用域下的定义时_(:з」∠)_


    推荐阅读