Zeb*_*ish 1 c++ windows string escaping
我真的很困惑转义字符"\"及其与Windows文件系统的关系.在以下示例中:
char* fwdslash = "c:/myfolder/myfile.txt";
char* backslash = "c:\myfolder\myfile.txt";
char* dblbackslash = "c:\\myfolder\\myfile.txt";
std::ifstream file(fwdslash); // Works
std::ifstream file(dblbackslash); // Works
std::ifstream file(backslash); // Doesn't work
Run Code Online (Sandbox Code Playgroud)
我得到你在这里做的是逃避一个特殊字符,所以你可以在这个字符串中使用它.绝不在字符串文字或std :: string中放置反斜杠,实际上是否更改了字符串---
---编辑:这是完全错误的,我的困惑源泉---
因此,似乎转义字符只被某些类或事物处理,而不是反斜杠,例如在控制台上输出,即std :: cout <<"\ hello"; 不会打印反斜杠.在ifstream的情况下(或者我不确定C fopen()版本是否适用),必须是这个类或函数将反斜杠视为转义字符.我想知道,因为Windows文件系统使用反斜杠它是不是有意义接受带有反斜杠的简单字符串,即"c:\ myfolder\myfile.txt"?尝试这种方式失败了.
此外,在我的编译器(Visual Studio)中,当我包含标题时,我可以使用.\和.. \表示当前文件夹或父文件夹.我很确定这里的\与转义字符无关,但是这些特定于Windows的格式,C预处理器的一部分,还是C或C++语言的一部分?我知道反斜杠是一个Windows的东西,所以我看不出任何理由,即使使用.\和.. \,另一个系统会期望反斜杠.
谢谢.
绝不会在字符串文字[...]中放置反斜杠,而是实际更改字符串
你做.编译器实际上修改了您在将其嵌入编译程序之前编写的文字.如果在解析源代码时在字符串或字符文字中找到反斜杠,则会忽略它,并且会特别处理下一个字符.\n变为回车等.对于没有特殊意义威胁的转义字符,实现定义.通常它只是意味着角色不变.
你不能只传递"c:\ myfolder\file.txt",因为它不是你的程序可以看到的字符串.您的程序将看到"c:myfolderfile.txt".这就是为什么转义反斜杠具有特殊含义,允许在程序将看到的实际字符串中嵌入反斜杠.
解决方案是转义反斜杠,或使用原始字符串文字(C++ 11以上):
const char* path = R"(c:\myfolder\file.txt)"
Run Code Online (Sandbox Code Playgroud)
赋予#include指令的文件名不是字符串文字,即使它们的格式为"path\to\header",因此替换规则不适用于它们.