AI智能摘要
				
			
			断言是C/C++中用于调试的工具,用于验证程序运行时的假设条件。assert宏在头文件中定义,当表达式求值为假时,会输出错误信息(含文件名、行号)并调用abort()终止程序;若定义NDEBUG宏,assert将被禁用为空操作。C11标准新增_Static_assert宏,可在编译时检测表达式,失败时报告错误并停止编译。实际使用中,assert适用于运行时检查,而发布版本常通过-DNDEBUG或#defineNDEBUG禁用断言以避免性能开销。
— 此摘要由AI分析文章内容生成,仅供参考。
				 
1 什么是断言
在C/C++语言中,断言是一种用于调试程序的工具,它用于验证程序在运行时的假设条件是否成立。断言通常用于检测代码中可能存在的逻辑错误或不符合预期的情况。
2 assert宏
C/C++语言中的断言通过assert<assert.h>assert宏的参数通常是一个条件表达式或逻辑表达式,如果表达式求值为false,assert宏就在stdeer中写入一条包含出问题的文件和行号的错误信息,并调用abort()函数终止程序。
assert宏的基本定义如下:
#ifdef NDEBUG
#define assert(expression) ((void)0)
#else
#define assert(expression) \
    ((expression) ? (void)0 : __assert_fail(#expression, __FILE__, __LINE__, __func__))
#endif
- NDEBUG宏:当定义了- NDEBUG宏时,- assert- ((void)0)
- assert(expression)- NDEBUG宏时,- assert- expression是否为真。如果- expression- __assert_fail
- __assert_fail
assert
#include <assert.h> assert(expression);
- expression- expression- assert- expression- assert
3 _Static_assert宏
在C11标准中,新增了一个_Static_assert宏,其作用类似于assertassert_Static_assert宏是在程序编译时检测表达式。因此,assert_Static_assert宏会导致程序无法通过编译。
_Static_assert宏接受两个参数,第一个参数是整形常量表达式,第二个参数是字符串。如果第一个参数求值为false,则编译器会报告第二个参数字符串并停止编译。
4 使用示例
4.1 使用断言
#include <stdio.h>
#include <assert.h>
int main() {
    int x = 5;
    assert(x == 5);  // 断言 x 等于 5
    printf("x is 5\n");
    assert(x == 10); // 断言 x 等于 10(这会失败)
    printf("x is 10\n");
    return 0;
}
在上面的代码中,第一次断言x == 5x is 5x == 10
4.2 禁用断言
断言在程序调试阶段非常有用,但是在性能关键的代码中,断言可能会增加额外的开销,因此通常会在发布版本中禁用。
我们可以通过定义NDEBUGNDEBUG,所有的assert宏将被预处理为一个空语句,不会进行任何检查。定义NDEBUG-DNDEBUG<assert.h>头文件之前使用#define NDEBUG,如下所示:
#define NDEBUG #include <assert.h>
 
                                    
原来assert在release版会直接蒸发,怪不得线上崩得悄无声息😂
补一句,gcc里__assert_fail还能自己重写,把日志打到远端,调试期直接起飞~
话说C11的_Static_assert真好用,编译期就把sizeof(int)==4卡死,省得跑半天才发现移植到16位MCU翻车