3 回答
TA贡献1824条经验 获得超8个赞
无法调试宏。 宏观扩张会导致奇怪的副作用。 宏没有“命名空间”,因此如果宏与其他地方使用的名称冲突,则会得到不需要的宏替换,这通常会导致奇怪的错误消息。 宏可能会影响你没有意识到的事情。
1)宏不能调试。
更换enum
const T
更换
2)宏观扩张会产生奇怪的副作用。
#define SQUARE(x) ((x) * (x))
x2 = SQUARE(x++)
x2 = (x++) * (x++);
#define safe_divide(res, x, y) if (y != 0) res = x/y;
if (something) safe_divide(b, a, x);else printf("Something is not set...");
更换
3)宏没有命名空间。
#define begin() x = 0
std::vector<int> v;... stuff is loaded into v ... for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it) std::cout << ' ' << *it;
更换
4)宏有你没有意识到的效果
#define begin() x = 0#define end() x = 17... a few thousand lines of stuff here ... void dostuff(){ int x = 7; begin(); ... more code using x ... printf("x=%d\n", x); end();}
更换
#define malloc(x) my_debug_malloc(x, __FILE__, __LINE__)#define free(x) my_debug_free(x, __FILE__, __LINE__)
my_debug_malloc
x++ * x++
x
x
TA贡献1830条经验 获得超9个赞
将幻数定义为宏 使用宏替换表达式
随着新的C+11有一个真正的选择,经过这么多年?
当为魔术数字定义宏时,编译器不保留定义值的类型信息。这可能导致编译警告(和错误),并混淆调试代码的人员。 当定义宏而不是函数时,使用该代码的程序员期望它们像函数一样工作,而它们没有。
#define max(a, b) ( ((a) > (b)) ? (a) : (b) )int a = 5;int b = 4;int c = max(++a, b);
int c = ( ((++a) ? (b)) ? (++a) : (b) ); // after this, c = a = 7
#include <algorithm>
#ifdef max#undef max#endif#include <algorithm>
如果宏作为常量计算为魔术数字,则不能按地址传递它。 对于宏作为函数,您不能使用它作为谓词,或接受该函数的地址或将其视为函式。
#define max
template<typename T>inline T max(const T& a, const T& b){ return a > b ? a : b;}
int a = 0;double b = 1.;max(a, b);
max<int>(a, b)
max<double>(a, b)
TA贡献1995条经验 获得超2个赞
#define DIV(a,b) a / b printf("25 / (3+2) = %d", DIV(25,3+2));
printf("25 / (3+2) = %d", 25 / 3 + 2);
#define DIV(a,b) (a) / (b)
- 3 回答
- 0 关注
- 237 浏览
添加回答
举报