Я нашел эту строку в файле проекта qmake:
DEFINES += SRCDIR=\\\"$$PWD/\\\"
Я знаю что PWD
часть означает распечатать рабочий каталог и я позволил
дай мне ценность SRCDIR
:
std::cout << "SRCDIR :" << SRCDIR << std::end;
Я также изменил переменную на SRCDIR=$$PWD
но это не сработает.
Но зачем нам слеш /
задники \
и кавычки "
чтобы получить PWD
?
qmake
специально обрабатывает символы кавычек и обратную косую черту.
Ваша конечная цель — определить строковый литерал как расширение SRCDIR
, Строковые литералы в C ++ содержатся в двойных кавычках, поэтому вам нужны эти кавычки, чтобы они передавались в компилятор как часть определения.
Другими словами, вы хотите эквивалент:
#define SRCDIR "somedir/"
где somedir
текущий рабочий каталог, в этом примере. Чтобы достичь этого, вы хотите избежать кавычки (так что это не обрабатывается специально qmake
) с помощью \"
, Это стоит на обоих концах строки.
А как насчет сбежавшего обратного слеша, \\
? Что ж, это еще больше ускользает от цитаты из обработки оболочки. Когда команда
cc -DSRCDIR="somedir/"
передается в оболочку, кавычки будут удалены как часть обработки оболочки. Чтобы эти кавычки оставались и определяли строковый литерал, вам нужно экранировать их с обратной косой чертой и на этом уровне. Оболочка будет конвертировать \"
в "
, Таким образом, полная escape-последовательность для символа двойной кавычки в этом случае:
\\\"
Этот токен появляется на обоих концах определенной строки. Прямая косая черта просто облегчает использование пути внутри кода; это устраняет необходимость добавлять /
везде, где вы используете путь.
Команда, которую видит оболочка, будет выглядеть
cc -DSRCDIR=\"somedir/\"
и определение SRCDIR
внутри компилятора будет строковый литерал, эквивалентный следующему определению в источнике:
#define SRCDIR "somedir/"
Других решений пока нет …