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?

8voto

John Stephen Punkte 7431

Eine weitere Lösung für den Stapel: Ändern Sie Ihre .m-Datei in .mm, so dass sie zu Objective-C++ wird und C++-Rohliterale verwendet, etwa so:

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

Rohe Literale ignorieren alles bis zur Beendigungssequenz, die im Standardfall aus Klammern und Anführungszeichen besteht.

Wenn die Klammer-Anführungszeichen-Sequenz irgendwo in der Zeichenkette erscheinen muss, können Sie auch einfach ein benutzerdefiniertes Begrenzungszeichen angeben, etwa so:

const char *sql_query = R"T3RM!N8(
                                  SELECT word_id
                                  FROM table1, table2
                                  WHERE table2.word_id = table1.word_id
                                  ORDER BY table1.word ASC
                         )T3RM!N8";

6voto

GCC fügt C++ mehrzeilige rohe String-Literale als C-Erweiterung hinzu

C++11 hat rohe Stringliterale, wie unter erwähnt: https://stackoverflow.com/a/44337236/895245

GCC fügt sie jedoch auch als C-Erweiterung hinzu, man muss nur die Option -std=gnu99 anstelle von -std=c99 . Z.B.:

main.c

#include <assert.h>
#include <string.h>

int main(void) {
    assert(strcmp(R"(
a
b
)", "\na\nb\n") == 0);
}

Kompilieren und ausführen:

gcc -o main -pedantic -std=gnu99 -Wall -Wextra main.c
./main

Dies kann zum Beispiel verwendet werden, um mehrzeilige Inline-Assemblierung in C-Code einzufügen: Wie schreibt man mehrzeiligen Inline-Assembler-Code in GCC C++?

Jetzt müssen Sie sich nur noch zurücklehnen und darauf warten, dass es auf C20XY standardisiert wird.

C++ wurde gefragt bei: C++ mehrzeiliges String-Literal

Getestet auf Ubuntu 16.04, GCC 6.4.0, binutils 2.26.1.

4voto

Dave DeLong Punkte 240835

Das können Sie auch tun:

NSString * query = @"SELECT * FROM foo "
                   @"WHERE "
                     @"bar = 42 "
                     @"AND baz = datetime() "
                   @"ORDER BY fizbit ASC";

0voto

Eine Alternative ist die Verwendung eines beliebigen Werkzeugs zum Entfernen von Zeilenumbrüchen. Schreiben Sie Ihre Zeichenfolge mit einem beliebigen Texteditor und fügen Sie den Text anschließend ein aquí und kopieren Sie es erneut in xcode.

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