【问题标题】:What do these strange macro definitions mean (and are they even correct?)这些奇怪的宏定义是什么意思(它们甚至正确吗?)
【发布时间】:2012-01-08 08:06:52
【问题描述】:

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

谁能告诉我它们是否正确(我怀疑不是),如果不正确,我该如何解决?

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

【问题讨论】:

  • 它们在代码中是在什么上下文中使用的?
  • @CodyGray 我不这么认为——这些绝对是逗号中不同的值。对我来说没有意义。
  • 也许最初的意图是(sizeof(size_t)==2 ? a : b)
  • 它们将(句法)作为函数(或可能是另一个宏)的参数列表有意义。虽然如果编译器抱怨它们,那么大概不是现在使用它们的上下文。

标签: c macros c-preprocessor


【解决方案1】:

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

#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(尽管可能有一些,尤其是在嵌入式计算领域)。

【讨论】:

  • 是的,三元运算符的事情实际上是有道理的。除非它一直在引起问题,否则它可能无关紧要。
  • Jonathan:我明白你为什么有这么高的声望分数了!我永远不会想到缺少的三元运算符。宏现在终于有意义了。我已经相应地修复了代码。谢谢!
【解决方案2】:

真正的作用是:

1, 65535, 2147483647
1, 16384, 1073741824

0, 65535, 2147483647
0, 16384, 1073741824

在现代编译器中。

它在抱怨,因为前两个表达式没有做任何事情。通常当你用逗号分隔操作时,这是因为你想同时发生一些事情。 (事实上​​,我并没有看到它们被大量使用。)

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

#define MAX_MEMORY_BLOCK 2147483647
#define MAX_ARRAY_SIZE   1073741824

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2011-12-09
    相关资源
    最近更新 更多