我编写了这段代码来测试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()的主体!!!
答案 0 :(得分:0)
static_assert
在编译时发生,但是if
语句中的决定在运行时发生。编译器无法知道if
子句是否为假,它需要查看if
语句的主体以了解是否要执行该操作。它会看到一个静态断言,该断言将失败,因此会生成编译错误。