【发布时间】:2011-10-05 01:43:52
【问题描述】:
首先,定义两个不带括号的常量表达式是我的错:
#define BIG_INTERVAL 60 * 60 * 1000
#define SMALL_INTERVAL 1 * 1000
int i = 1;
if (i >= BIG_INTERVAL / SMALL_INTERVAL - 1)
{
printf("Oops!\n");
}
宏展开后的if语句为if(i >= 60 * 60 * 1000 / 1 * 1000 - 1)。
这不是我的本意。但是如果我写if (i >= 3600000000 - 1),我会发现一些奇怪的东西。是假的。
60 * 60 * 1000 / 1 * 1000 - 1 是什么类型? int?
【问题讨论】:
-
这就是为什么明智的程序员不使用
#define作为常量的原因。 -
@jalf:或者你可以记住用括号括起来......
-
你可以。如果您确保附近有医生,就可以用同样的方式向自己的脚开枪?为什么不正确地做,并使用实际的类型常量(例如,
static const int,或者可能是枚举)? -
@icktoofay:问题是括号将解决这个特定问题,直到你忘记它们,即使你不这样做,你也会遇到一个不同的问题,即将出现宏。使用宏时要跟踪的事情太多了。考虑一下我工作的一个项目中的这个宏:
#define for_all( iterator_t, it, container ) for ( iterator_t it = (container).begin(); it != (container).end(); ++it ),它被用作:for_all( std::vector<int>::const_iterator, it, v ) std::cout << *it;简单......对吗? -
将问题重新标记为“c”。您的代码不是 c++;在 C++ 中你不应该使用 printf() 和 #define's
标签: c type-conversion