C++11特性的学习之保证稳定性和兼容性(一)

  目录括号内为适合人群,所有库作者的内容暂不做学习,可自行查阅《深入理解C++11:C++11新特性解析与应用》。网盘链接: https://pan.baidu.com/s/1Jf29R7-foOoXJ5UW3mTKVA 密码: 7vgq

目录

1.保持与C99兼容(部分人)
  ①预定义宏
  ②_func_预定义标识符
  ③_Pragma操作符
  ④变长参数的宏定义以及_VA_ARGS_
  ⑤宽窄字符串连接
2.long long 整型(部分人)
3.扩展的整型(部分人)
4.宏__cplusplus(部分人)
5.静态断言(库作者)
  ①断言:运行时与预处理时
  ②静态断言与static_assert
6.noexcept修饰符与noexcept操作符(库作者)
7.快速初始化成员变量(部分人)
8.非静态成员的sizeof(部分人)
9.扩展的friend语法(部分人)
10.final/override控制(部分人)
11.模板函数的默认模板参数(所有人)
12.外部模板(部分人)
  ①为什么需要外部模板
  ②显式的实例化与外部模板的声明
13.局部和匿名类型作模板实参(部分人)

1.保持与C99兼容 ^

 ①预定义宏 ^

宏名称 功能描述
__STDC_HOSTED__ 如果编译器的目标系统环境中包含完整的标准C库,那么这个宏就定义为1,否则宏的值为0
__STDC__ C编译器通常用这个宏的值来表示编译器的实现是否和C标准一致。这个宏是否定义以及定义成什么值由编译器决定
__STDC_VERSION__ C编译器通常用这个宏来表示所支持的C标准的版本。这个宏是否定义以及定义成什么值由编译器决定
__STDC_ISO_10646__ 这个宏通常定义为一个yyyymmL格式的整数常量,如199712L,用来表示C++编译环境符合某个版本的ISO/IEC 10646标准

  预定义宏对于多目标平台代码的编写通常具有重大意义。通过以上的宏,我们可以通过使用#ifdef#endif等预处理指令,就可使得平台相关代码只在适合于当前平台的代码上编译,从而在同一套代码中完成对多平台的支持。

#include 
using namespace std;

int main(){
    cout<<"是否有标准C库"<<__STDC_HOSTED__<//输出1
    //后三个宏在我的编译器上未定义
}

 ②_func_预定义标识符 ^

  __func__预定义标识符,其基本功能就是返回所在函数的名字

#include 
using namespace std;
const char* hello(){ return __func__;}
const char* world(){ return __func__;}
int main(){
    cout<" "<//输出hello world
}

  __func__预定义标识符对于轻量级的调试代码具有十分重要的作用。在C++11中,标准允许其使用在类或结构体中

#include 
using namespace std;
class helloWorld {
public:
    const char* hello() { return __func__; }
    const char* world() { return __func__; }
};
int main(){
    helloWorld h;
    cout << h.hello() << " " << h.world() << endl;//输出hello world
}

注:__func__标识符作为参数的默认值是不允许的

 ③_Pragma操作符 ^

  在C/C++标准中,#pragma是一条预处理的指令,简单的说是用来向编译器传达语言标准以外的一些信息。如:

#pragma once //指示编译器该头文件应该只被编译一次
//等同于
#ifndef THIS_HEADER

你可能感兴趣的:(C++11,C++11)