2016-06-20 17 views
2

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

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

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

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

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

Но почему нам нужен слэш /, backslahses \ и кавычки " получить PWD?

+0

. .. потому что qmake нарушается, когда дело доходит до цитирования –

ответ

2

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

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

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

#define SRCDIR "somedir/" 

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

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

cc -DSRCDIR="somedir/" 

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

\\\" 

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

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

cc -DSRCDIR=\"somedir/\" 

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

#define SRCDIR "somedir/"