二 保证稳定性和兼容性
保持与C99兼容
预定义宏
C99语言标准增加的一些预定义宏,C++11同样增加了对这些宏的支持
功能是返回所在函数的名字,在C++11中,标准甚至允许其使用在类或者结构体中
C/C++标准中,#pragma是一条预处理的指令,用来向编译器传达语言标准以外的一些信息,例如#pragma once 表示该头文件应该只被编译一次
在C++11中,标准定义了与预处理指令#pragma功能相同的操作符_Pragma,例如 _Pragma ("once");
在C99标准中,变长参数的宏定义是指在宏定义中参数列表的最后一个参数为省略号,而预定义宏__VA_ARGS__则可以在宏定义的实现部分替换省略号所代表的字符串
#define PR(...) printf(__VA_ARGS__)
C++标准中,将窄字符串(char)转换成宽字符串(wchar_t)是未定义的行为
在C++11标准中,在将窄字符串和宽字符串进行连接时,会将窄字符串转换成宽字符串,然后再与宽字符串进行连接
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>之前.
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异常声明所取代
void except_func() noexcept; 表示不抛出异常
void except_func() noexcept(常量表达式);表达式为true不会抛出异常;flase抛出异常
原文:https://www.cnblogs.com/lizhanzhe/p/10978394.html