Понимание термина \\\"$$PWD/\\\" в файле проекта qmake

Я нашел эту строку в файле проекта qmake:

DEFINES += SRCDIR=\\\"$$PWD/\\\"

Я знаю что PWD-part обозначает рабочий каталог печати, и я позволю дать мне значение SRCDIR:

std::cout << "SRCDIR :" << SRCDIR << std::end;

Я также изменил переменную на SRCDIR=$$PWD но это не сработает.

Но зачем нам слеш /задники \ и кавычки " чтобы получить PWD?

1 ответ

Решение

qmake будет обрабатывать символы кавычек и обратную косую черту специально.

Ваша конечная цель - определить строковый литерал как расширение SRCDIR, Строковые литералы в C++ содержатся в двойных кавычках, поэтому вам нужны эти кавычки, чтобы они передавались в компилятор как часть определения.

Другими словами, вы хотите эквивалент:

#define SRCDIR "somedir/"

где somedir текущий рабочий каталог, в этом примере. Чтобы достичь этого, вы хотите избежать кавычки (так что это не обрабатывается специально qmake) с помощью \", Это стоит на обоих концах строки.

А как насчет сбежавшего обратного слеша, \\? Что ж, это еще больше ускользает от цитаты из обработки оболочки. Когда команда

cc -DSRCDIR="somedir/"

передается в оболочку, кавычки будут удалены как часть обработки оболочки. Чтобы эти кавычки оставались и определяли строковый литерал, вам нужно экранировать их с обратной косой чертой и на этом уровне. Оболочка будет конвертировать \" в ", Таким образом, полная escape-последовательность для символа двойной кавычки в этом случае:

\\\"

Этот токен появляется на обоих концах определенной строки. Прямая косая черта просто облегчает использование пути внутри кода; это устраняет необходимость добавлять / везде, где вы используете путь.

Команда, которую видит оболочка, будет выглядеть

cc -DSRCDIR=\"somedir/\"

и определение SRCDIR внутри компилятора будет строковый литерал, эквивалентный следующему определению в источнике:

#define SRCDIR "somedir/"
Другие вопросы по тегам