我正在阅读“C ++编码标准:101规则,指南和最佳实践”一书,它说使用#define
是不好用的。当我查看某些头文件时,他们有很多#define
个。如果使用#define
s很糟糕,为什么会有这么多?谢谢。
答案 0 :(得分:5)
#define
是一种不好的做法,因为:
他们没有任何范围:
#define
不尊重范围,因此无法创建类范围的命名空间。虽然变量可以在类中作用域。
编译错误期间奇怪的魔法数字:
如果您正在使用#define
那些在预编译时被预处理器取代那么如果您在编译期间收到错误,那将会引起混淆,因为错误消息不会引用宏名称而是值和它会出现突然的价值,而且会浪费很多时间在代码中跟踪它。
调试问题:
同样出于#2中提到的相同原因,虽然调试#define
实际上不会提供太多帮助。
因此,最好使用const
变量而不是#define
在上述所有方面,它们都优于#define
。#define
可能真正有用的区域是您需要在代码中进行实际文本替换或定义包含标题保护的位置。
为什么{C}标头文件中广泛使用
#define
?
我想到的一个原因是,In C(与C ++不同)const
声明不会产生常量表达式。这意味着在引入 可变长度数组之前 < / strong>在C标准中,不能写出像:
const int max_val = 100;
int foos[max_val];
因为在C max_val
中不是编译时常量,并且在引入VLA之前,数组下标需要编译时间常量。
因此,必须将其写为:
#define MAX_VAL 100
int foos[MAX_VAL];
答案 1 :(得分:2)
这可能指的是定义常量的旧C方法:
#define MAX_SOMETHING 100
int x = MAX_SOMETHING;
这些常量没有输入,它们使用字符串替换进行了扩展,并使调试更加困难,因为一旦编译了源代码,就不清楚该定义的来源。
更多C ++的做法是:
const int max_something = 100;
int x = max_something;
由于这是一个强类型值,因此需要进行所有必需的检查和适当的转换。
另一个好处是可以将const
值放入名称空间和类中以用于组织目的。 #define
在范围上是全局性的,因此碰撞是一个问题,这会导致名称长度过长以避免冲突。
在const
和template
之间,允许一种形式的元编程C本身并不存在,#define
所需的场合数量相当减少。但是并没有完全消除,因为如果没有#import
指令,你仍然需要添加旧的#ifndef __HEADER_FILE_NAME__
守卫,以确保不包括两次。
答案 2 :(得分:0)
本书的广泛含义并非如此 - #define
具有宏观等的位置,但对于定义常量,现在使用
例如
#define FOO 257
最好在
完成const int FOO=257;
这允许进行类型检查,因为#define会变得有点奇怪
char c=FOO;