如何从-D编译器定义的Windows路径变量创建字符串文字

sho*_*l74 6 c c++ path string-formatting compiler-options

在Windows下,我有一个包含Windows样式路径的环境变量.我想在我的程序中构建该路径并将其打印出来.因此,如果我的路径是c:\ top,我使用-DTOP = $(TOP)将其传递给编译器.注意我在将它传递给编译器之前无法将其转换为c:\\ top.

现在,我有相当于:

#define TOP=c:\top
Run Code Online (Sandbox Code Playgroud)

我想要相当于:

char path[]="c:\\top";
Run Code Online (Sandbox Code Playgroud)

我不能只使用stringafication运算符:

#define WRAP1(X) #X
#define WRAP(X) WRAP1(X)
char path[] = WRAP(TOP);
Run Code Online (Sandbox Code Playgroud)

这只会导致字符串"c:\ top",编译器将其视为转义序列(即\ t).

我认为一个可能的解决方案是构建一个字符串文字,但其他解决方案也可以.有没有办法使用宏来构造一个可以产生的字符串文字:

char path[] = R"foo(c:\top)foo";
Run Code Online (Sandbox Code Playgroud)

到目前为止,由于涉及"或()或\"的变化的原因,我的所有尝试都失败了.

谢谢.

Nei*_*eil 2

您可以通过在定义的路径前添加字符串化运算符 # 将其转换为字符串。然而,这仅适用于宏。实际上,您需要一个双宏才能使其正常工作,否则它只会打印 TOP。另外,将路径名放在引号中也很重要 - 哦,该示例将路径存储在 env PathDirName 下

定义编译器的路径 -

/DTOP="\"$(PathDirName)\\""
Run Code Online (Sandbox Code Playgroud)

在代码中使用

#define STRINGIZE2(x) #x
#define STRINGIZE(x) STRINGIZE2(x)

char path[] = STRINGIZE(TOP);
Run Code Online (Sandbox Code Playgroud)

这对我有用。您几乎已经成功了,所以希望这会有所帮助。

[编辑] 我现在可以看到问题 - 在 C:\top 中 - 它采用“反斜杠 t”作为控制代码 -“\t”。这个解决方案变得有点噩梦 - 因为您确实需要创建带有两个斜杠或使用正斜杠的文件名。我确实觉得在全面回顾所发生的事情之前回答问题让我感到困惑。我尝试了几种方法 - 但无法更改传入的定义 - 我只能建议使用正则表达式库或手动扫描字符串 - 用正确的“\”字母替换控制字符。

我已经敲出了一个示例,仅在示例中使用“\t”来显示这一点 - 这不是很好的代码,它是为了解释正在做什么而编写的,希望它给出了一个直观的示例,并且它确实做到了(以一种不太好的方式) )解决您在“C:\top”中遇到的一个问题..正如我所说 - 如果使用这种咳嗽方法,您将需要处理所有控制代码。:-)

char stringName[256];
char* pRefStr = STRING(TOP);
char* pDestStr = stringName;
int nStrLen = strlen( pRefStr );

for( int nIndex = 0; nIndex < nStrLen; nIndex++ )
{
    if ( *pRefStr == '\t' )
    {
        *pDestStr++ = '\\';
        *pDestStr++ = 't';
        pRefStr++;
    }
    else
    {
        *pDestStr++ = *pRefStr++;
    }
}
*pDestStr = '\0';
Run Code Online (Sandbox Code Playgroud)

再次 - 抱歉造成任何混乱 - 我在这里留下了我的答案作为您的参考 - 希望有人会想出一种处理定义字符串(带有控制字符)的方法。

谢谢,尼尔