码迷,mamicode.com
首页 > 编程语言 > 详细

深入理解C++11

时间:2019-01-02 12:43:34      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:而在   imp   stream   err   col   __file__   sig   应用   构造函数   

深入理解C++11

1、很多 现实 的 编译器 都 支持 C99 标准 中的__ func__ 预定 义 标识符 功能, 其 基本 功能 就是 返回 所在 函数 的 名字。

  编译器 会 隐式 地 在 函数 的 定义 之后 定义__ func__ 标识符。

const char* hello() 
{ 
    static const char* __func__ = "hello";
    return __func__; 
}

  __func__ 可以用于构造函数中。

#include < iostream> 
using namespace std;

struct TestStruct {
  TestStruct () : name(__ func__) {}
  const char *name;
};

int main()
{
  TestStruct ts;
  cout << ts. name << endl; // TestStruct
}
// 编译 选项: g++ -std= c++ 11 2- 1- 3. cpp

  不过 将__ fun__ 标识符 作为 函数参数的默认值不允许 的,

void FuncFail( string func_ name = __func__) {};// 无法 通过 编译

 

 2、在 C99 标准 中, 程序员 可以 使用 变长参数的宏定义。 变长 参数 的 宏 定义 是 指在 宏 定义 中 参数 列表 的 最后 一个 参数 为 省略号, 而 预 定义 宏__ VA_ ARGS__ 则 可 以在 宏 定义 的 实现 部分 替换 省略号 所 代表 的 字符串。

#define PR(...) printf(__ VA_ ARGS__)

  一个应用的例子。

#include < stdio. h> 

#define LOG(...) {\
  fprintf( stderr,"% s: Line %d:\ t", __FILE__, __LINE__);\
  fprintf( stderr, __VA_ ARGS__);\
  fprintf( stderr,"\ n");\
}

int main() {
  int x = 3; // 一些 代码...
  LOG(" x = %d", x); // 2- 1- 5. cpp: Line 12: x = 3
}
// 编译 选项: g++ -std= c++ 11 2- 1- 5. cpp

 

3、long long 是C99标准。C++11中才将其定为正式标准。事实上,在C++11以前,很多编译器也支持了long long。

  long long 整型 有 两种: long long 和 unsigned long long。 在 C++ 11 中, 标准 要求 long long 整型 可以 在 不同 平台 上有 不同 的 长度, 但 至少 有 64 位。

  我们 在 写 常数 字面 量 时, 可以 使用 LL 后缀( 或是 ll) 标识 一个 long long 类型 的 字面 量, 而 ULL( 或 ull、 Ull、 uLL) 表示 一个 unsigned long long 类型 的 字面 量。

long long int lli = -9000000000000000000LL; 
unsigned long long int ulli = -9000000000000000000ULL;

   下面 的 类型 是 等价 的: long long、 signed long long、 long long int、 signed long long int; 而 unsigned long long 和 unsigned long long int 也是 等价 的。

  对于 printf 函数 来说, 输出 有 符号 的 long long 类型 变量 可以 用 符号% lld, 而无 符号 的 unsigned long long 则 可以 采用% llu。

 

4、__cplusplus

  比如 在 C++ 03 标准 中,__ cplusplus 的 值 被 预定 为 199711L, 而在 C++ 11 标准 中, 宏__ cplusplus 被 预 定义 为 201103L。

  这点 变化 可以 为 代码 所用。 比如 程序员 在想 确定 代码 是 使用 支持 C++ 11 编译器 进行 编译 时, 那么 可以 按下 面的 方法 进行 检测:

  

#if __cplusplus < 201103L #error "should use C++ 11 implementation" #endif

Michael Wong; IBM XL译器中国开发团队. 深入理解C++11 :C++11 新特性解析与应用 (原创精品系列) (Kindle 位置 805-806). 机械工业出版社. Kindle 版本. 

 

深入理解C++11

标签:而在   imp   stream   err   col   __file__   sig   应用   构造函数   

原文地址:https://www.cnblogs.com/tekkaman/p/10207375.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!