2016-06-20 5 views
2

ich diese Zeile in einem qmake-Projektdatei gefunden Legendes:

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

Ich weiß, dass die PWD -Teil steht für Verzeichnis drucken und ich lasse geben Sie mir den Wert von SRCDIR arbeiten:

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

Ich änderte auch die Variable SRCDIR=$$PWD, aber es wird nicht funktionieren.

Aber warum brauchen wir einen Schrägstrich /, backslahses \ und Anführungszeichen " um die PWD zu bekommen?

+0

:

Der Befehl, der die Schale wie

cc -DSRCDIR=\"somedir/\" 

und die Definition von SRCDIR innerhalb der Compiler eine Stringliteral, das entspricht der folgenden Definition in-source wird aussehen sieht. ..wenn qmake gebrochen ist, wenn es um das Zitieren geht –

Antwort

2

qmake wird speziell mit Anführungszeichen und Backslashes umgehen.

Ihr Endziel ist es, ein Zeichenfolgenliteral als Erweiterung von SRCDIR definiert zu haben. String-Literale in C++ sind in doppelten Anführungszeichen enthalten, daher benötigen Sie diese Anführungszeichen, um sie als Teil der Definition zum Compiler durchzuwandeln.

Mit anderen Worten, möchten Sie das Äquivalent von:

#define SRCDIR "somedir/" 

wo somedir ist das aktuelle Arbeitsverzeichnis, in diesem Beispiel. Um dies zu erreichen, möchten Sie das Zitat (qmake) nicht mit \" umgehen. Dies steht an beiden Enden der Saite.

Nun, was ist mit dem Escape Backslash, \\? Nun, das entzieht sich dem Zitat aus der Shell-Verarbeitung. Wenn der Befehl an die Shell übergeben wird, werden die Anführungszeichen als Teil der Verarbeitung der Shell entfernt. Um sicherzustellen, dass diese Anführungszeichen erhalten bleiben und ein Zeichenfolgenliteral definiert wird, müssen Sie sie auch auf dieser Ebene mit einem umgekehrten Schrägstrich versehen. Die Shell konvertiert \" in ". So ist die volle Escape-Sequenz für ein doppeltes Anführungszeichen in diesem Fall:

\\\" 

Dieses Token wird an beiden Enden der definierten Zeichenfolge. Der Schrägstrich macht es einfach, den Pfad innerhalb des Codes zu verwenden. Es entfällt die Notwendigkeit, einen / überall dort hinzuzufügen, wo Sie den Pfad verwenden.

#define SRCDIR "somedir/" 
Verwandte Themen