您的位置:首页 > 编程语言 > C语言/C++

C++11保证稳定性和兼容性(一):保持与C99兼容

2016-03-09 10:57 260 查看
为保证C++的稳定性及兼容性,C++11共进行了17处改动,接下来的几篇博客会一一介绍。

C++11将下面C99特性的支持都纳入了新标准中

1,C99中的预定义宏

2,__func__预定义标识符

3,_Pragma操作符

4,不定参数宏定义以及__VA_ARGS__

5,宽窄字符串连接

1.1,C++11中与C99兼容的宏



1.2,__func__预定义标识符

1,该标识符基本功能是返回所在函数的名字,事实上,按照标准定义,编译器会隐式的在函数的定义之后定义该标识符

如:const char* hello(){return __func__;}

实际定义等同于:

const char* hello()

{

static const char* __func__ = "hello";

return __func__;

}

2,C++11还允许该标识符可以使用在类或者结构体中

如:

struct TestStruct

{

Test Struct() : name(__func__){}

const char* name;

};

效果与在函数中使用一样,将那么初始化为"TestStruct"

3,该标识符不能作为函数参数的默认值

如:void Func(string func_name = __func__){};//无法编译通过,原因:参数声明时,__func__还未被定义

1.3,_Pragma操作符

C++11中定义了_Pragma操作符与预处理指令#pragma功能相同

如:_Pragma("once");同#pragma once效果

1.4,不定参数宏定义以及__VA_ARGS__

变长参数的宏定义是指宏定义中参数列表的最后一个参数为省略号,而__VA_ARGS__可以将宏定义实现部分替换省略号所代表的字符串

如:#define PR(...) printf(__VA_ARGS__)

1.5,宽窄字符串连接

之前的标准中,将窄字符串(char)转换成宽字符串(wchar_t)是未定义的行为,而在C++11标准中,窄字符串和宽字符串进行连接时,支持C++11的编译器会将窄字符串转换成宽字符串,然后在进行连接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: