首页 > 编程语言 > 详细

深入理解C++11 阅读笔记

时间:2019-06-05 11:38:21      阅读:92      评论:0      收藏:0      [点我收藏+]

二 保证稳定性和兼容性
保持与C99兼容

技术分享图片

预定义宏
C99语言标准增加的一些预定义宏,C++11同样增加了对这些宏的支持

  • __func__预定义标识符

  功能是返回所在函数的名字,在C++11中,标准甚至允许其使用在类或者结构体中

  • _Pragma操作符

  C/C++标准中,#pragma是一条预处理的指令,用来向编译器传达语言标准以外的一些信息,例如#pragma once 表示该头文件应该只被编译一次
  在C++11中,标准定义了与预处理指令#pragma功能相同的操作符_Pragma,例如 _Pragma ("once");

  • 变长参数的宏定义以及__VA_ARGS__

  在C99标准中,变长参数的宏定义是指在宏定义中参数列表的最后一个参数为省略号,而预定义宏__VA_ARGS__则可以在宏定义的实现部分替换省略号所代表的字符串
  #define PR(...) printf(__VA_ARGS__)

 

  • 宽窄字符串的连接

  C++标准中,将窄字符串(char)转换成宽字符串(wchar_t)是未定义的行为
  在C++11标准中,在将窄字符串和宽字符串进行连接时,会将窄字符串转换成宽字符串,然后再与宽字符串进行连接

 

 

宏__cpluscplus__

   C与C++混用头文件的典型用法

1 #ifidef __cplusplus
2 extern "C" {
3 #endif
4 // 一些代码
5 #ifdef __cplusplus
6 }
7 #endif

 

   C++11中   __cplusplus 被定义为 201103L    可以用来检测是否支持C++11

#if __cplusplus < 201103L
    #error "should use C++11 implemention "    //预编译指令
#endif

 

 

静态断言
  断言就是将一个返回值总是需要为真的判别式放在语句中,用于排除在设计的逻辑上不应该产生的情况,以迫使程序在发生异常时,退出,从而避免程序陷入逻辑的混乱


  头文件assert.h定义的宏受NDEBUG的影响.如果预程序在处理这个头文件时已经定义了NDEBUG,assert宏的内容就定义为空,这意味着assert宏不在起作用.所以,可以在最终发布程序的时候可以使用-DNDEBUG关闭断言功能或者把#define NDEBUG加到每个源文件中,但这条语句必须放在#include <assert.h>之前.

  • 静态断言与static_assert

    assert运行时断言
      C++11标准中,引入了static_assert断言,解决编译时断言

  static_assert(常量表达式,提示字符串)。

  如果第一个参数常量表达式的值为真(true或者非零值),那么static_assert不做任何事情,就像它不存在一样,否则会产生一条编译错误,错误位置就是该static_assert语句所在行,错误提示就是第二个参数提示字符串。

 

noexcept修饰符与noexcept操作符

  C++98中,动态异常声明throw(int,double), C++11中被弃用

1 void except_func() throw(int, double){ ... }

   表示函数不会抛出异常的动态异常声明throw()也被新的noexcept异常声明所取代

  • noexcept

    void except_func() noexcept; 表示不抛出异常
    void except_func() noexcept(常量表达式);表达式为true不会抛出异常;flase抛出异常
技术分享图片

 

深入理解C++11 阅读笔记

原文:https://www.cnblogs.com/lizhanzhe/p/10978394.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!