为什么VS C ++中的路径包含正斜杠而不是反斜杠?

时间:2015-03-18 10:31:32

标签: c++ backslash

我有成千上万的文件包含带有正斜杠的文件

#include <this/thread.hpp>

为什么呢?原始程序是在VS 2008中编写的。

这会导致致命错误C1083

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

3 个答案:

答案 0 :(得分:2)

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

我无法读懂思想,但我可以猜测正斜杠是用于(潜在)可移植性和/或标准符合性的名称,因为include伪指令中的反斜杠在c ++ 03中有未定义的行为。

c ++03§2.8/ 2:

  

如果字符'或\中的任何一个,或者字符序列/ *或//中的任何一个出现在q-char序列或h-char序列中,或者字符“出现在h-char-中序列,行为未定义。

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

c ++ 11draft§2.9/ 2

  

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

关于你的错误:

  

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

密切关注您的两个不同的include指令。与路径分隔符有更多不同。首先,正斜杠版本不引用父路径(../),其次路径包含在< >中,这种情况在这种情况下是错误的,因为看起来该路径是相对的当前文件。有关详细信息,请参阅https://stackoverflow.com/a/21594/2079303

答案 1 :(得分:0)

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

#include <this/thread.hpp>

在include目录路径中的任何位置都有一个名为“ this ”的目录吗?这比正向斜线更容易成为问题。

答案 2 :(得分:0)

虽然不是C ++特定的,但使用\是转义字符的地方,至少在<...>标记内时,如果你真的想将它指定为路径分隔符,您需要输入\\。为了避免在每次只想使用一种反斜杠时执行双反斜杠,并且因为它的行为方式相同,如果只使用/,则可以应用相同的功能来指定文件夹之间的路径分隔。这种简单性可以减少对无法理解转义的人的困惑,这样他们就不会从字面上获取转义路径并将其放入资源管理器地址栏,并在不将它们带到正确位置时感到困惑。

请注意,如果需要<...>标记,则表示您正在指定系统文件,而"..."语句则包含本地生成的标记。这些语法在逃避要求方面有所不同。