【问题标题】:x-macro conditional error - number comparisonx-macro 条件错误 - 数字比较
【发布时间】:2015-06-08 16:10:51
【问题描述】:

我想为所有X(a, b) 其中a > b 生成X 宏的编译时错误

/* X(a, b) */
#define LIST \
    X(10, 20) \
    X(5,  20) \
    X(30, 20) \
    X(1,  20)

因此,为X(30, 20) 生成错误

这在 C 中可能吗?

编辑:示例用法 对我来说,左边的数字是一些大型结构的 sizeof,右边的数字是存储这个结构的固定空间。如果结构大于可用空间,我需要编译器生成错误。

//e.g.
X(sizeof(struct conf), 2*PAGE)

【问题讨论】:

  • 这甚至没有意义..
  • 有道理。我已经用一些例子编辑了这个问题。
  • 是的。这些东西是非常特定于编译器和特定语言版本的,这意味着不是我的专业领域。

标签: c macros x-macros


【解决方案1】:

是的,这是一个概念证明:

#pragma push_macro("X")
#undef X
#define X(a,b) typedef int x[(a>b)?-1:1];
LIST
#pragma pop_macro("X")

所以,我们定义X 来定义一个整数数组类型,可以是-1 也可以是1,这取决于a 是否大于b。如果是,-1 元素的数组会报错。

如果使用 C11,typedef 行可以使用来自 assert.hstatic_assert(a<=b) 完成

【讨论】:

  • 错误信息有点神秘,但这正是我所需要的。
  • @j123b567 您也许可以将类型从 x 重命名为 a_is_greater_than_b_at_line_ ##__LINE__ 或其他名称。
【解决方案2】:

在 C11 中可以使用 _Static_assert 关键字:

#define X( a , b )  _Static_assert( a <= b , "Error!" ) 

注意表达式 a 和 b 必须是常量。

【讨论】:

  • 谢谢,这很好,但我不确定是否可以在这个项目中使用 C11 功能。
  • @j123b567 寻找一个与您的编译器表现良好的 static_assert 实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2014-09-02
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多