建设网站经验,手机购物网站怎么推广,公司网站横幅如何做,单县做网站文章目录前言assertstatic_assert前言
断言(Assertion)是一种常用的编程手段#xff0c;用于排除程序中不应该出现的逻辑错误。它是一种很好的Debug工具。其作用是判断表达式是否为真。C提供了assert和static_assert来进行断言。在C库中也有断言#xff0c;其中断言与C的相同…
文章目录前言assertstatic_assert前言
断言(Assertion)是一种常用的编程手段用于排除程序中不应该出现的逻辑错误。它是一种很好的Debug工具。其作用是判断表达式是否为真。C提供了assert和static_assert来进行断言。在C库中也有断言其中断言与C的相同静态断言是_Static_assert。
assert
assert是一个仿函数宏用于程序在运行时进行断言。它在标头assert.h中定义
#ifdef NDEBUG
#define assert(condition) ((void)0)
#else
#define assert(condition)
#endif若编译为release版本编译器一般会定义NDEBUG则assert失效。若是在debug下assert 中的表达式若为假则 assert 在标准错误输出上输出实现指定的诊断信息并调用 std::abort 。
因为 assert 是仿函数宏在 condition 中未被括号保护的逗号都被转译成宏参数的分隔符。而assert只接受一个参数所以需要注意
assert(std::is_same_vint, int); // 错误 assert 不接收二个参数
assert((std::is_same_vint, int)); // 正确一个参数
static_assert(std::is_same_vint, int); // 正确非宏
std::complexdouble c;
assert(c std::complexdouble{0, 0}); // 错误
assert((c std::complexdouble{0, 0})); // 正确 下面我们以一个字符串换成类作为示例代码在设置内容和打印内容的时候进行断言保证m_str分配了内存
#include assert.h
#include string.h
#include iostream
using namespace std;class StrBuf{
private:char* m_str nullptr;
public:void alloc_memory(int size){if(m_str nullptr)m_str new char[size];}void setbuf(const char* str){assert(m_str ! nullptr);strcpy(m_str,str);}void print(){assert(m_str ! nullptr);for(int i0;m_str[i]!\0;i)coutm_str[i];}
};int main(){StrBuf sbuf;sbuf.alloc_memory(10);sbuf.setbuf(hello);sbuf.print();
}输出正常输出文本内容
hello如果我们将alloc_memory函数(分配内存)注释掉
int main(){StrBuf sbuf;//sbuf.alloc_memory(10);sbuf.setbuf(hello);sbuf.print();
}输出的内容如下运行时输出了断言结果并结束了程序
Assertion failed: m_str ! nullptr, file D:\SingleSources\CPP\8.cpp, line 15static_assert
C11新增了静态断言static_assert它是内置的因此使用静态断言不需要包含头文件。与assert在运行时检查不同static_assert在编译阶段时检查源代码。
static_assert ( boolean expression, message ) //since C11
static_assert ( boolean expression ) //since C17示例静态断言一个为FALSE的表达式
constexpr bool getFalseExpr(){return false;
}int main(){static_assert(getFalseExpr(),false expression);
}编译时报错并输出了信息false expression
8.cpp: In function int main():
8.cpp:6:31: error: static assertion failed: false expression6 | static_assert(getFalseExpr(),false expression);| ~~~~~~~~~~~~^~