我在qmake项目文件中找到了这一行:
DEFINES += SRCDIR=\\\"$$PWD/\\\"
我知道PWD
- 部分代表打印工作目录,我让
给我SRCDIR
的价值:
std::cout << "SRCDIR :" << SRCDIR << std::end;
我还将变量更改为SRCDIR=$$PWD
但不起作用。
但为什么我们需要使用斜杠/
,后退\
和引号"
来获取PWD
?
答案 0 :(得分:2)
qmake
将专门处理引号字符和反斜杠。
您的最终目标是将字符串文字定义为SRCDIR
的扩展。 C ++中的字符串文字包含在双引号中,因此您需要将这些引号作为定义的一部分传递给编译器。
换句话说,你想要相当于:
#define SRCDIR "somedir/"
其中somedir
是当前工作目录,在此示例中。为实现此目的,您希望使用qmake
来转义引号(因此\"
不特别处理它)。它位于字符串的两端。
现在,转义反斜杠\\
怎么样?好吧,这进一步逃脱了shell处理的引用。当命令
cc -DSRCDIR="somedir/"
传递给shell,引号将作为shell处理的一部分被剥离。要确保这些引号保留,并定义字符串文字,您需要在此级别使用反斜杠转义它们。 shell会将\"
转换为"
。因此,在这种情况下双引号字符的完整转义序列是:
\\\"
此标记出现在已定义字符串的两端。正斜杠只是使代码中的路径更容易使用;它消除了在使用路径的任何地方添加/
的需要。
shell看到的命令看起来像
cc -DSRCDIR=\"somedir/\"
并且编译器中SRCDIR
的定义将是一个字符串文字,相当于in-source中的以下定义:
#define SRCDIR "somedir/"