c++ 11 特性

来源:互联网 发布:mysql datetime 减法 编辑:程序博客网 时间:2024/05/29 12:29

除去语法规范等,包括标准库的接口函数定义、相关的类型、宏、常量等也都会被发布在语言标准中。相较于C89标准,C99语言标准增加一些预定义宏。C++11同样增加了对这些宏的支持。我们可以看一下表2-1。

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

使用这些宏,我们可以查验机器环境对C标准和C库的支持状况,如代码清单2-1所示。

代码清单2-1
#include <iostream>
using namespace std;

int main() {
    cout << "Standard Clib: " << __STDC_HOSTED__ << endl;   // Standard Clib: 1
    cout << "Standard C: " << __STDC__ << endl;             // Standard C: 1
    // cout << "C Stardard version: " << __STDC_VERSION__ << endl;
    cout << "ISO/IEC " << __STDC_ISO_10646__ << endl;       // ISO/IEC 200009
}

// 编译选项:g++ -std=c++11 2-1-1.cpp

在我们的实验机上,__STDC_VERSION__这个宏没有定义(也是符合标准规定的,如表2-1所示),其余的宏都可以打印出一些常量值。

预定义宏对于多目标平台代码的编写通常具有重大意义。通过以上的宏,程序员通过使用#ifdef/#endif等预处理指令,就可使得平台相关代码只在适合于当前平台的代码上编译,从而在同一套代码中完成对多平台的支持。从这个意义上讲,平台信息相关的宏越丰富,代码的多平台支持越准确。

不过值得注意的是,与所有预定义宏相同的,如果用户重定义(#define)或#undef了预定义的宏,那么后果是“未定义”的。因此在代码编写中,程序员应该注意避免自定义宏与预定义宏同名的情况。

原创粉丝点击