我使用C的assert.h
assert
函数的方法类似于下面的方法:
int x = 3;
if (x == 3)
printf("x is 3 ✅");
assert(x != 3);
在运行它时,我发现if
语句被完全跳过,程序在达到assert
语句时终止.不用说,在我找到罪魁祸首之前,这在我的程序中造成了几个非常糟糕的错误.这可能是什么原因呢?为什么条件条件被完全跳过了?如果它没有被跳过,那么为什么里面的代码没有被执行?我在网上建立了一个here个例子.
我使用C的assert.h
assert
函数的方法类似于下面的方法:
int x = 3;
if (x == 3)
printf("x is 3 ✅");
assert(x != 3);
在运行它时,我发现if
语句被完全跳过,程序在达到assert
语句时终止.不用说,在我找到罪魁祸首之前,这在我的程序中造成了几个非常糟糕的错误.这可能是什么原因呢?为什么条件条件被完全跳过了?如果它没有被跳过,那么为什么里面的代码没有被执行?我在网上建立了一个here个例子.
不跳过if
语句.
当assert
被执行时,它不被认为是"干净的"程序终止.因此,不会刷新I/O缓冲区.try 添加fflush()
调用以显式刷新stdout
的缓冲区:
int x = 3;
if (x == 3)
{
printf("x is 3 ✅");
fflush(stdout);
}
assert(x != 3);
以下是C17标准的相关段落(斜体强调我的):
7.2.1.1个
ASSERT宏将诊断测试放入程序中;它扩展为一个空表达式.执行时,如果表达式(应该具有标量类型)为FALSE(即,比较等于0),则Assert宏将有关失败的特定调用的信息(包括参数文本、源文件名、源行号和封闭函数的名称-后者分别是预处理宏
__FILE__
和__LINE__
以及标识符__func__
的值)以实现定义的格式写入标准错误流.It then calls the abort function.
7.22.4.1个
ABORT功能导致abnormal program termination发生,除非信号SIGABRT 正在被捕获,并且信号处理程序不返回.Whether open streams with unwritten buffered data are flushed, open streams are closed, or temporary files are removed is implementation-defined.