为啥在定义为宏值的路径中指定的反斜杠会被删除?有没有办法避免这种情况?

Posted

技术标签:

【中文标题】为啥在定义为宏值的路径中指定的反斜杠会被删除?有没有办法避免这种情况?【英文标题】:why do the backslashes specified in a path defined as a macro value get removed? Is there a way to avoid this?为什么在定义为宏值的路径中指定的反斜杠会被删除?有没有办法避免这种情况? 【发布时间】:2018-07-24 18:59:24 【问题描述】:

在我的 Visual Studio 应用程序中,我在 C/C++ -> Preprocessor -> Preprocessor Definitions 下的项目属性中定义了一个预处理器宏 SDK_INC。

宏定义如下:

SDK_INC=$(WindowsSDK_IncludePath)

然后在我的代码中,我访问 SDK 包含路径,如下所示:

#define STRINGIZE(x) #x

#define STR_VALUE(x) STRINGIZE(x)

char sdkPath[1000] = STR_VALUE(SDK_INC);

但是,在调试时,我发现从宏中获取的路径已删除所有反斜杠。 我发现这个问题并不特定于 $(WindowsSDK_IncludePath) 本身,而是一个带有反斜杠的通用问题。 即即使我直接定义宏而不使用 $(WindowsSDK_IncludePath) 像这样:

SDK_INC=C:\Program Files...blahblah

在运行时获得的路径仍然会删除反斜杠。

任何关于它为什么会这样表现以及应该做些什么来获得不删除任何反斜杠的路径的见解?

【问题讨论】:

@Ron 为什么你认为应该避免元编程? 不是因为被识别为(未知)转义序列而被删除了吗? @MateuszGrzejek 摘自“Effective C++”,第 1 章,第 2 项,第 16 页:“像这样的宏(函数)有很多缺点,光是想想就很痛苦。 i>”我同意这一点。 @Ron 你也指模板元编程吗? @appleapple 仅宏。 【参考方案1】:

在 C++ 中,将为 Escape sequences 处理包含反斜杠的字符串,即编译器查找反斜杠 \ 后跟一个已知字符。

这意味着像C:\Program Files\Windows\blahblah 这样的路径将看到\P\W\b

PW 没有在识别的转义序列列表中定义,而是用字符本身替换,\P 给出 P\W 相同。

\b 然而被定义为退格,现在你得到了

C:Program FilesWindows<backspace>lahblah

如果要保留反斜杠,则必须将它们加倍,例如

C:\\Program Files\\Windows\\blahblah

现在编译器看到 \\ 并将每个替换为单个 \

【讨论】:

dieche 感谢您提供有用的信息... 我给出的路径 C:\Program Files... 只是显示一般问题的示例。正如我在问题中解释的那样,我的问题是在运行时使用 VS 环境变量 $(WindowsSDK_IncludePath) 替换源代码中的 Platform SDK 包含路径变量的值。因此,我无法控制用双反斜杠替换此路径中的单个反斜杠。您能建议我如何从 $(WindowsSDK_IncludePath) 中提取“包括”反斜杠的路径吗? @AnuragSSharma C++11 中有原始字符串文字,但这不适用于宏,AFAIK。

以上是关于为啥在定义为宏值的路径中指定的反斜杠会被删除?有没有办法避免这种情况?的主要内容,如果未能解决你的问题,请参考以下文章

为啥JSON字符串当中会出现反斜杠?

为啥反斜杠出现两次?

为啥反斜杠出现两次?

为啥我的 Solidity 构造函数需要两个未在参数中指定的变量?

找不到映像文件中指定的资源类型 GetLastError 1813

为啥这个 Haskell 程序会产生反斜杠?