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

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

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

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

它们包含逗号运算符; 只有最后一个值“计数”,所以它们相当于:

#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, 65535, 2147483647
1, 16384, 1073741824

要么

0, 65535, 2147483647
0, 16384, 1073741824

在现代编译器中。

这是抱怨,因为前两个表达式什么都不做。 通常,当你用逗号分开操作时,这是因为你想要同时发生某些事情。 (事实上​​,我根本没有看到他们使用太多。)

如果你想摆脱警告,你可以改变他们只是:

#define MAX_MEMORY_BLOCK 2147483647
#define MAX_ARRAY_SIZE   1073741824

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

链接地址: http://www.djcxy.com/p/73617.html

上一篇: What do these strange macro definitions mean (and are they even correct?)

下一篇: "unused parameter" warnings in C