我在qmake项目文件中找到了这一行:
DEFINES += SRCDIR=\"$$PWD/\"
我知道PWD
-部分代表打印工作目录,我让给我SRCDIR
的值:
std::cout << "SRCDIR :" << SRCDIR << std::end;
我也将变量更改为 SRCDIR=$$PWD
,但它将不起作用。
但是,为什么我们需要斜线/
,Backslahses 和引号标记
"
才能获得PWD
?
qmake
将专门处理引用字符和背斜线。
您的最终目标是将字符串定义为SRCDIR
的扩展。C 中的字符串文字包含在双引号中,因此您需要这些引号将其作为定义的一部分使其贯穿编译器。
换句话说,您想要:
#define SRCDIR "somedir/"
在此示例中, somedir
是当前的工作目录。为了实现这一目标,您想逃脱报价(因此,qmake
不专门处理)使用"
。这位于字符串的两端。
现在,逃脱的后斜线, \
呢?好吧,这进一步从外壳处理中逃脱了报价。当命令
cc -DSRCDIR="somedir/"
传递给外壳,引号将作为外壳处理的一部分剥离。为了确保这些引号保留并定义字符串文字,您也需要在此级别的后斜线上逃脱它们。外壳将将"
转换为"
。因此,在这种情况下,双引号字符的完整逃生序列是:
\"
这个令牌出现在定义字符串的两端。前斜线仅使使用代码内的路径变得更加容易。它消除了在您使用路径的任何地方添加/
的需求。
外壳看到的命令看起来像
cc -DSRCDIR="somedir/"
以及编译器内部的SRCDIR
的定义将是字符串文字,相当于以下定义:
#define SRCDIR "somedir/"