深入理解C++11
【深入理解C++11】
1、很多 現實 的 編譯器 都 支持 C99 標準 中的__ func__ 預定 義 標識符 功能, 其 基本 功能 就是 返回 所在 函數 的 名字。
編譯器 會 隱式 地 在 函數 的 定義 之後 定義__ func__ 標識符。
const char* hello() { static const char* __func__ = "hello"; return __func__; }
__func__ 可以用於構造函數中。
#include < iostream>
using namespacestd;
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