原生字串字面量 是c++11標準引入的用於避免手動將字串換碼的新特性。
按照標準要求,其內部的一切文字都將原封不動地、所見即所得地宣告為字串。現在的問題是,預處理指令理應先於一切其他語言特性進行,在一些編譯系統中(如 mingw),預處理階段甚至是由 cpp.exe(cpreprocessor)這一單獨的程式完成的。而預處理指令處於一行開頭且以#開始,如果在原生字串字面量中的乙個新行裡頂頭寫上一句 #include 指令,會發生什麼呢?
在c++98/03中,這個擔心是沒有必要的,因為字串必須在一行內宣告完,但由於c++11的這個新特性的提出,就產生了這一問題。事實的真相到底是什麼呢?實驗讓你眼見為實:
#include using namespace std;
/**測試從這裡開始*/
const char str =
r"(#include "example.txt")";
int main(int argc,char * argv)
樣例測試字串
編譯環境:windows 7 旗艦版 sevice pack 1,intel(r) celeron(r) m cpu 723,32位作業系統,tdm-gcc-32 4.7.2。
編譯選項:mingw32-g++ test.cpp -o test.exe -std=c++11
下面執行程式。
如果 #include 得到先一步執行,那麼程式將輸出 example.txt 的內容(試驗時它的內容是「樣例測試字串」);如果編譯器無視了 #include 指令,那麼程式將輸出如上**中寫入的「\n#include "example.txt"\n」。
執行結果是這樣的:
prompt>mingw32-g++ test.cpp -o test.exe -std=c++11
prompt>test
實際變數 str 的內容是:
#include "example.txt"
顯然,#include 指令並未被展開。
我們的結論是:原生字串字面量中的一切文字,包括預處理指令,都會被看做是「純」的、「普通」的文字,而不會發揮(它可能具有的)語義功能;而這也與標準中對它的「原生的、不加處理的」的描述相符。
C 11新特性(一)
侯捷 c 11新特性 variadic templates uniform initialization initializer lists alias template 用例void print template typename t,typename.types void print const...
C 11新特性 auto關鍵字
熟悉指令碼語言的人都知道,很多指令碼語言都引入了 型別自動推斷 技術 比如python,可以直接宣告變數,在執行時進行型別檢查。隨著c 11標準的發布,c 語言也引入了型別自動推斷的功能,這就是我們今天要介紹的auto關鍵字。c 是一種強型別語言,宣告變數時必須明確指出其型別。但是,在實踐中,優勢我...
C 11新特性 auto關鍵字
在c 98標準中就存在著auto關鍵字,c 98標準中auto關鍵字用於自動變數的宣告,但在預設情況下即使不宣告auto,函式內部的變數也是具有自動儲存期的。因此由於使用極少且多餘,在c 11中已刪除這一用法。void fun c 11新標準引入了auto型別說明符,採用它可以讓編譯器幫助我們分析表...