【问题标题】:Why Path in VS C++ contains forward slash not backslash?为什么 VS C++ 中的路径包含正斜杠而不是反斜杠?
【发布时间】:2015-03-18 10:31:32
【问题描述】:

我得到了数千个文件,其中包含带有正斜杠的文件

#include <this/thread.hpp>

为什么?原程序是用VS 2008编写的。

这会导致致命错误 C1083

如果我将路径更改为#include "..\this\thread.hpp",它会找到文件

【问题讨论】:

标签: c++ backslash


【解决方案1】:

Windows 接受正斜杠和反斜杠作为路径分隔符。至少从 Windows XP 开始。

我无法读心,但我猜想正斜杠是以(潜在的)可移植性和/或标准合规性的名义使用的,因为包含指令中的反斜杠在 c++03 中具有未定义的行为。

c++03 §2.8/2:

如果字符 ' 或 \,或者字符序列 /* 或 // 出现在 q-char-sequence 或 h-char-sequence 中,或者字符 " 出现在 h-char-序列,行为未定义。

根据草案,c++11 中的措辞有所改变。行为不再是未定义的,而是实现定义的。

c++11 草案 §2.9/2

字符 ' 或 \ 或字符序列 /* 或 // 在 a q-char-sequence 或 h-char-sequence 有条件地支持实现定义的语义,如 是字符 " 在 h 字符序列中的外观。

关于你的错误:

如果我将路径更改为 #include "..\this\thread.hpp" 它会找到文件

密切注意您的两个不同的包含指令。有比路径分隔符更多的区别。首先,正斜杠版本不引用父路径 (../),其次路径包含在 &lt; &gt; 中,在这种情况下这是错误的,因为看起来该路径是相对于当前文件的。详情请见https://stackoverflow.com/a/21594/2079303

【讨论】:

  • 如果兼容,为什么 "/" 在 windows 7 上会出现问题?
  • 如果您的包含仅与 \ 一起使用,那么它似乎是一个错误。如果您有可重现的案例,我建议您向微软报告错误。
  • @jean 我已经更新了与您的错误有关的答案。
【解决方案2】:

错误 C1083 是“无法打开包含文件”,这通常意味着编译器找不到该文件。

#include <this/thread.hpp>

在您的包含目录路径中的任何位置是否有一个名为“this”的目录?这比正斜杠更有可能成为问题。

【讨论】:

  • 文件夹“this”存在。
  • 但它是否在任何包含路径中? (例如,鉴于您的更新,“..”在您的包含路径集中吗?)
【解决方案3】:

虽然不是 C++ 特定的,但 \ 是一个转义字符,至少当它在 &lt;...&gt; 标签内时,如果你真的想将它指定为路径分隔符,你需要输入\\。为了避免每次只使用一种类型的反斜杠时都使用双反斜杠,并且因为它的作用方式相同,如果您只使用/,您可以应用相同的功能来指定文件夹之间的路径分隔。这种简单性减少了对不了解转义的人的困惑,因此他们不会按照字面意思选择转义路径并将其放入资源管理器地址栏中,并且当它没有将他们带到正确的位置时会感到困惑。

请注意,如果它需要&lt;...&gt; 标签,则您指定的是系统文件,而"..." 语句将包含本地生成的文件。这些语法的转义要求不同。

【讨论】:

    猜你喜欢
    • 2016-12-12
    • 2020-11-12
    • 2014-04-12
    • 2021-07-13
    • 2019-01-28
    • 2016-03-12
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多