ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C11编译时断言static_assert

2022-02-01 01:02:50  阅读:194  来源: 互联网

标签:断言 CXX assert 编译 static C11 模板


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)

  

标签:断言,CXX,assert,编译,static,C11,模板
来源: https://www.cnblogs.com/7star/p/15858750.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有