这些奇怪的宏定义意味着什么(甚至它们是否正确?)

时间:2012-01-08 08:06:53

标签: c macros c-preprocessor

我正在研究一些遗留的C代码,并且有两个奇怪的宏定义。它们看起来不正确,并且还负责一些编译器警告(警告:逗号表达式的左侧操作数无效),这花了我几个小时才最终找到这些宏。

任何人都可以告诉我他们是否正确(我怀疑不是),如果没有,我该如何解决?

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

2 个答案:

答案 0 :(得分: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(虽然可能有一些,特别是在嵌入式计算领域)。

答案 1 :(得分:2)

这才是真正的作用:

1, 65535, 2147483647
1, 16384, 1073741824

0, 65535, 2147483647
0, 16384, 1073741824

在现代编译器中。

它抱怨,因为前两个表达式没有做任何事情。通常,当您使用逗号分隔操作时,这是因为您希望同时发生某些事情。 (事实上​​,我认为它们根本没用过。)

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

#define MAX_MEMORY_BLOCK 2147483647
#define MAX_ARRAY_SIZE   1073741824

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