C11编译时断言static_assert
2022/2/1 6:59:20
本文主要是介绍C11编译时断言static_assert,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
C++11标准新引入的static_assert功能可以实现静态断言,是一个非常强大的模板元编程工具,配合SFINAE特性可以在编译期发现不符合预期的不合理特化,并且给出自定义的错误信息。
1. _Static_assert
是 C11 中引入的关键字。 static_assert
是 C11 中引入的宏,它映射到 _Static_assert
关键字。它们可用于全局或函数范围。
2. _assert
和 _wassert
函数在运行时测试软件断言,并产生运行时成本
3. static_assert关键字,用来做编译期间的断言,因此叫做静态断言。
语法: static_assert(常量表达式,提示字符串)。
参数描述: 如果第一个参数常量表达式的值为false,会产生一条编译错误,错误位置就是该static_assert语句所在行,
第二个参数就是错误提示字符串。
作用:
使用static_assert,我们可以在编译期间发现更多的错误,用编译器来强制保证一些契约,并帮助我们改善编译信息的可读性,尤其是用于模板的时候。
static_assert可以用在全局作用域中,命名空间中,类作用域中,函数作用域中,几乎可以不受限制的使用。
编译器在遇到一个static_assert语句时,通常立刻将其第一个参数作为常量表达式进行演算,
但如果该常量表达式依赖于某些模板参数,则延迟到模板实例化时再进行演算,这就让检查模板参数成为了可能。
由于是static_assert编译期间断言,不生成目标代码,因此static_assert不会造成任何运行期性能损失。
#include <stdio.h> #include <assert.h> using namespace std; enum Items { A, B, C, LENGTH }; int main(void) { // _Static_assert is a C11 keyword printf("debug \n"); static_assert(LENGTH == 5, "Expected Items enum to have three elements"); // Preferred: static_assert maps to _Static_assert and is compatible with C++ static_assert(sizeof(int) == 4, "Expecting 32 bit integers"); return 0; }
CXX := g++ -std=c++11 -Wall ifeq ($(DEBUG),1) CXXFLAGS += -O0 -DDEBUG -D_DEBUG -g else CXXFLAGS += -O2 -DNDEBUG endif OBJS := test.o DEPS := $(OBJS:.o=.d) EXE := test all: $(EXE) -include $(DEPS) $(EXE): $(OBJS) $(CXX) $(CXXFLAGS) -o $@ $^ # Common C++ compile rule. ifeq ($(SUPPORT_EXT_DEPS),1) CXX_COMPILE_RULE = $(CXX) -c $(CXXFLAGS) -MMD -MP -MF $(@:.o=.d) -o $@ $< else CXX_COMPILE_RULE = $(CXX) -c $(CXXFLAGS) -MMD -o $@ $< endif clean: rm -f $(OBJS) $(DEPS) $(EXE)
这篇关于C11编译时断言static_assert的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-17getExternalFilesDir这个方法哪些安卓版本可以使用?-icode9专业技术文章分享
- 2024-11-17app下载好后,安装包更新代码怎么写?-icode9专业技术文章分享
- 2024-11-17login-customer-id 如何获取?-icode9专业技术文章分享
- 2024-11-17使用 vite加载.env 文件环境变量无法加载是什么原因?-icode9专业技术文章分享
- 2024-11-17tp钱包是什么,有哪些功能?-icode9专业技术文章分享
- 2024-11-16在电脑上怎么模拟手机的运行环境?-icode9专业技术文章分享
- 2024-11-16接收socket数据,莫名其妙socket就关闭了是怎么回事?-icode9专业技术文章分享
- 2024-11-16ts nightly是什么?-icode9专业技术文章分享
- 2024-11-16如何升级vscode版本?-icode9专业技术文章分享
- 2024-11-16如何设置vscode默认的node版本?-icode9专业技术文章分享