首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结合静态断言和断言?

结合静态断言和断言?
EN

Stack Overflow用户
提问于 2015-04-21 20:43:09
回答 3查看 167关注 0票数 3

我有一个像这样的函数:

代码语言:javascript
复制
int div_round_up(int x, int y) {
    /**
     *  This function only works for positive divisor and non-negative dividend!!
     */
    assert(y > 0 && x >= 0);
    if (x == 0)
        return 0;
    return (x - 1) / y + 1;
}

它不适用于y <= 0x < 0。这是可以的,我甚至可以动态地检查正确的值,但是我想静态地检查,当有人输入错误的值时。如果我将x和y定义为无符号,它们就会从负值无声地转换为巨大的正值,这会产生错误的结果,所以我不想那样。我想让编译失败,当有人试图给它提供负值时,比如在div_round_up(variable, -7)中。我该怎么办?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-21 20:56:59

要在编译时验证一个数字(这就是static_assert所做的),必须在编译时知道它。要了解为什么需要这样做,请考虑一下类似于div_round_up(read_integer_from_file(), read_keyboard_character())的内容。这样做的明显缺点是,您必须在编译时知道数字。

最简单的方法是使它们成为模板参数,这允许您将函数的实现(几乎)保持不变:

代码语言:javascript
复制
template<int x, int y>
int div_round_up() {
    static_assert(y > 0 && x >= 0, "This function only works for positive divisor and non-negative dividend");
    if (x == 0)
        return 0;
    return (x - 1) / y + 1;
}

它可以称为div_round_up<3, 4>() fires

票数 3
EN

Stack Overflow用户

发布于 2015-04-21 21:02:28

如果您使用gcc或clang,您可以包括一个宏

代码语言:javascript
复制
#define div_round_up(a, b) (__builtin_constant_p(b) ? drus(a, b) : drud(a, b))

和两个不同的函数,其中drus包含b的静态断言,而drud不包含。

票数 2
EN

Stack Overflow用户

发布于 2015-04-21 21:04:55

是的,你可以用一些魔法来做这件事(一位俄罗斯代码大师告诉我这个技巧)

代码语言:javascript
复制
#define check2(x) typedef char checkVal[(x)?1:-1];
int main() {
    check2(3<4);
    check2(5<4);
    return 0;
}

但在这种情况下也有一个限制。编译器应该知道这个值的结果。在任何另一种情况下,这是不可接受的(IMHO)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29782741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档