C 11新特性探索 一 原生字串字面量問題

2021-09-02 09:20:19 字數 1221 閱讀 6066

原生字串字面量 是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型別說明符,採用它可以讓編譯器幫助我們分析表...