簡體   English   中英

C++ 使用宏生成原始字符串

[英]C++ make a string raw using macros

所以要在 C++ raw 中創建一個字符串,你可以

std::string raw = R"raw_string(text_here""n/whatever)raw_string"

但我的問題是你能做一個預處理字符串的宏嗎?
所以它是原始的,但在代碼中看起來很正常? 就像在 function 參數中一樣

#define start_raw_string R"raw_string(
#define end_raw_string )raw_string"

void example(std::string raw_text){
    std::cout << start_raw_string raw_text end_raw_string << std::endl;
// here all this  ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾   is
// an entire string ...
// equivalent to R"raw_string(<RAW_TEXT_HERE>)raw_string"
}
int main(){
    example("text_here""n/whatever");
    // will print >> text_here""n/whatever
}

正如您通過突出顯示看到的那樣,它肯定不會像這樣工作
所以有什么解決方法嗎? 在這里找到了一些關於宏粘合的東西
https://www.iar.com/knowledge/learn/programming/advanced-preprocessor-tips-and-tricks/

但試過了,但不能讓它工作……所以? 它應該是可行的,因為它不是
編譯時。

它不能像這樣工作。 將字符串文字傳遞給 function 后,它就不再是std::string了。 字符串文字是您在代碼中鍵入的內容。 它不是你可以傳遞的東西。 即使您將char[N]傳遞給 function 它也無法工作。 您不能將字符數組轉換為文字(因此也不能轉換為原始文字)。

請注意,語法是有原因的。 開始/結束字符序列與原始字符串文字一起出現,因為原始字符串文字不能包含該序列。 比較一下:

std::cout << R"x()x")x";  // error

很明顯錯誤是什么:原始字符串文字不能包含)x" ,其中:

std::cout << macro_voodoo(")x") // error ?!?

這看起來不錯,但會導致令人困惑的錯誤消息,因為開始和結束字符序列在代碼中不可見。

為可讀性和清晰性編寫代碼,不要試圖繞過 C++ 語法。 5 個字符表示字符串文字是原始的應該是可以接受的。 只有當您不需要分隔符時,它甚至可以是 3。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM