繁体   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