美文网首页
深入理解C++11 2.5 static_assert

深入理解C++11 2.5 static_assert

作者: zinclee123 | 来源:发表于2019-08-08 19:04 被阅读0次

在C++中,标准在<cassert>或者<assert.h>头文件中未程序员提供了assert宏,例如:

#include <cassert>

using namespace std;

char* arrayAlloc(int n){
    assert(n>0);
    return new char[n];
}

int main(){
    char* a = arrayAlloc(0);
}

C++中,可以通过定义宏NDEBUG来禁用assert宏,对发布来说是应该禁用的。定义NDEBUG后,assert宏将被展开为一条无意义的C语句并被编译期优化掉。
还有种方法是通过#error这样的预处理指令,例如:

#ifndef _COMPLEX_H
#error "Never use xxxx"
#endif

注意,断言assert只有在程序运行的时候才能起作用,而#error只在编译器处理时才能起作用,编译时断言可以用static_assert,接受两个参数,一个是断言表达式,一个是输出的错误信息,例如:

template<typename t, typename u> int bit_copy(t& a, u& b){
    static_assert(sizeof(b) == sizeof(a), "the params of bit_copy must have same width");
}

需要注意的是,static_assert的断言表达式的结果必须是编译时期可以计算的表达式,即必须是常量表达式,不可以用变量。

相关文章

网友评论

      本文标题:深入理解C++11 2.5 static_assert

      本文链接:https://www.haomeiwen.com/subject/qajfjctx.html