380 Stimmen

Wie teilt man ein String-Literal über mehrere Zeilen in C / Objective-C?

Ich habe eine ziemlich lange Sqlite-Abfrage:

const char *sql_query = "SELECT statuses.word_id FROM lang1_words, statuses WHERE statuses.word_id = lang1_words.word_id ORDER BY lang1_words.word ASC";

Wie kann ich ihn in mehrere Zeilen unterteilen, damit er leichter zu lesen ist? Wenn ich folgendes tue:

const char *sql_query = "SELECT word_id
                        FROM table1, table2
                        WHERE table2.word_id = table1.word_id
                        ORDER BY table1.word ASC";

Ich erhalte eine Fehlermeldung.

Gibt es eine Möglichkeit, Abfragen in mehreren Zeilen zu schreiben?

658voto

Georg Schölly Punkte 120083

Es gibt zwei Möglichkeiten, Zeichenketten über mehrere Zeilen aufzuteilen:

  1. Jeder String in einer eigenen Zeile. Funktioniert nur mit Zeichenketten:

    • Einfaches C:

      char *my_string = "Line 1 "
                        "Line 2";
    • Objektiv-C:

      NSString *my_string = @"Line1 "
                             "Line2";    // the second @ is optional
  2. Verwendung von \ - kann für jeden Ausdruck verwendet werden:

    • Einfaches C:

      char *my_string = "Line 1 \
                         Line 2";
    • Objektiv-C:

      NSString *my_string = @"Line1 \
                              Line2";

Der erste Ansatz ist besser, weil er nicht so viel Leerraum enthält. Bei einer SQL-Abfrage ist jedoch beides möglich.

HINWEIS: Mit einer #define müssen Sie eine zusätzliche \ um die beiden Zeichenketten zu verketten:

Einfaches C:

#define kMyString "Line 1"\
                  "Line 2"

140voto

Es gibt einen Trick, den Sie mit dem Präprozessor anwenden können.
Dies hat den Nachteil, dass der Leerraum verkleinert wird und für die Leser des Codes verwirrend sein könnte.
Aber es hat den Vorteil, dass Sie keine Anführungszeichen in den Text einfügen müssen.

#define QUOTE(...) #__VA_ARGS__
const char *sql_query = QUOTE(
    SELECT word_id
    FROM table1, table2
    WHERE table2.word_id = table1.word_id
    ORDER BY table1.word ASC
);

der Präprozessor verwandelt dies in:

const char *sql_query = "SELECT word_id FROM table1, table2 WHERE table2.word_id = table1.word_id ORDER BY table1.word ASC";

Ich habe diesen Trick verwendet, als ich einige Unit-Tests schrieb, die große literale Strings mit JSON enthielten. Das bedeutete, dass ich nicht jedes Anführungszeichen "\" auslassen musste.

25voto

DenverCoder9 Punkte 3577

Sie können auch in XCode -> Voreinstellungen die Registerkarte Einrückung auswählen und den Zeilenumbruch aktivieren.

Auf diese Weise müssen Sie nichts mehr extra eingeben, und es funktioniert auch für das, was Sie bereits geschrieben haben :-)

Eine ärgerliche Sache ist allerdings...

if (you're long on indentation
    && short on windows) {
            then your code will
                end up squished
                     against th
                         e side
                             li
                              k
                              e

                              t
                              h
                              i
                              s
}

24voto

Flaviu Punkte 6143

Da ich dieses Problem ständig habe, habe ich ein kleines Tool entwickelt, um Text in eine mehrzeilige Objective-C-Zeichenkette mit Escape-Effekt zu konvertieren:

http://multilineobjc.herokuapp.com/

Ich hoffe, das spart Ihnen etwas Zeit.

20voto

Berik Punkte 7536

Ausweitung der Zitat Idee für Objective-C:

#define NSStringMultiline(...) [[NSString alloc] initWithCString:#__VA_ARGS__ encoding:NSUTF8StringEncoding]

NSString *sql = NSStringMultiline(
    SELECT name, age
    FROM users
    WHERE loggedin = true
);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X