C static_assert第一个参数

时间:2018-12-15 11:42:02

标签: static-assert

我编写了这段代码来测试static_assert

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <inttypes.h>

#define static_assert _Static_assert

typedef enum {ONE=1, TWO, THREE} num_t;

uint8_t Is_Num_Valid(num_t number){
uint8_t i = 0;
    for(i=1;i<4;i++){
        if(number == i){
            return 1;
        }
    }
    return 0;
}

int main()
{
    num_t number;
    number = ONE;
    printf("%d\n", Is_Num_Valid(number));

    if(Is_Num_Valid(number)){
        static_assert(0, "Number entered is out of boundaries");
    }


    printf("Number is> %d\n", number);
    return 0;
}

总是会导致编译错误 错误:静态声明失败:“输入的数字超出范围”

为什么这不起作用,如果条件为0,则不应执行if()的主体!!!

1 个答案:

答案 0 :(得分:0)

static_assert在编译时发生,但是if语句中的决定在运行时发生。编译器无法知道if子句是否为假,它需要查看if语句的主体以了解是否要执行该操作。它会看到一个静态断言,该断言将失败,因此会生成编译错误。