2.1 保持与C99兼容
类别:部分人
在C11之前最新的C标准是1999年制定的C99标准。而第一个C++语言标准却出现在1998年(通常被称为C++98),随后的C++03标准也只对C++98进行了小的修正。这样一来,虽然C语言发展中的大多数改进都被引入了C++语言标准中,但还是存在着一些属于C99标准的“漏网之鱼”。所以C++11将对以下C99特性的支持也都纳入了新标准中:
❑C99中的预定义宏
❑func预定义标识符
❑_Pragma操作符
❑不定参数宏定义以及VA_ARGS
❑宽窄字符串连接
这些特性并不像语法规则一样常用,并且有的C++编译器实现也都先于标准地将这些特性实现,因此可能大多数程序员没有发现这些不兼容。但将这些C99的特性在C++11中标准化无疑可以更广泛地保证两者的兼容性。我们来分别看一下。
2.1.1 预定义宏
除去语法规范等,包括标准库的接口函数定义、相关的类型、宏、常量等也都会被发布在语言标准中。相较于C89标准,C99语言标准增加一些预定义宏。C++11同样增加了对这些宏的支持。我们可以看一下表2-1。
使用这些宏,我们可以查验机器环境对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了预定义的宏,那么后果是“未定义”的。因此在代码编写中,程序员应该注意避免自定义宏与预定义宏同名的情况。