这些奇怪的宏定义是什么意思(而且它们是否正确)?

3

我正在处理一些旧的C代码,遇到了两个奇怪的宏定义。它们看起来不正确,并且也导致编译器发出一些警告(warning: left-hand operand of comma expression has no effect),这让我花了几个小时才最终追踪到这些宏。

有人能告诉我它们是否正确(我怀疑不是),如果不正确,我该如何修复它们?

#define MAX_MEMORY_BLOCK (sizeof(size_t)==2,65535,2147483647)
#define MAX_ARRAY_SIZE   (sizeof(size_t)==2,16384,1073741824)

在代码中它们被用于什么样的上下文? - Eve Freeman
@CodyGray我不这么认为 - 这些逗号中的值肯定是不同的。对我来说没有道理。 - Eve Freeman
2
也许最初的意图是 (sizeof(size_t)==2 ? a : b) - Mat
它们作为函数的参数列表(或者可能是另一个宏)会有(语法上的)意义。但是如果编译器对它们进行投诉,那么显然它们现在使用的上下文不是这样的。 - Richard Kettlewell
2个回答

5

它们包含逗号运算符; 只有最后一个值“计数”,因此它们等效于:

#define MAX_MEMORY_BLOCK (2147483647)
#define MAX_ARRAY_SIZE   (1073741824)

或者,有些人忘记了三元运算符使用 ?:

#define MAX_MEMORY_BLOCK (sizeof(size_t)==2 ? 65535 : 2147483647)
#define MAX_ARRAY_SIZE   (sizeof(size_t)==2 ? 16384 : 1073741824)

然而,在现代系统中,sizeof(size_t) == 2 的很少(尽管可能在嵌入式计算领域有一些)。


是的,三元运算符确实有道理。除非它一直在引起问题,否则它可能并不重要。 - Eve Freeman
Jonathan: 我能理解你为什么拥有如此高的声誉分数!我从来没有想过会缺少三元运算符。现在宏定义终于有意义了。我已经相应地修复了代码。谢谢! - Homunculus Reticulli

2
这实际上是做什么的呢:
1, 65535, 2147483647
1, 16384, 1073741824

或者

0, 65535, 2147483647
0, 16384, 1073741824

在现代编译器中。

它抱怨的原因是前两个表达式没有任何作用。通常,当你使用逗号分隔操作时,是因为你想同时发生某些事情。(实际上,我几乎没有看到它们被广泛使用。)

如果你想要摆脱警告,你可以将它们改为:

#define MAX_MEMORY_BLOCK 2147483647
#define MAX_ARRAY_SIZE   1073741824

我不确定这些值是否真正有意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接