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不会造成任何运行期性能损失。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具