1. 程式人生 > >深入理解C++11

深入理解C++11

類型 args ace 選項 return tst c++11 def 出版社

深入理解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