¿Cómo dividir una cadena literal en varias líneas en C/Objective-C?

Resuelto Ilya Suzdalnitski asked hace 15 años • 9 respuestas

Tengo una consulta SQLite bastante larga:

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";

¿Cómo puedo dividirlo en varias líneas para que sea más fácil de leer? Si hago lo siguiente:

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

Recibo un error.

¿Existe alguna forma de escribir consultas en varias líneas?

Ilya Suzdalnitski avatar Apr 28 '09 18:04 Ilya Suzdalnitski
Aceptado

Hay dos formas de dividir cadenas en varias líneas:

  1. Cada cadena en su propia línea. Funciona sólo con cuerdas:

    • Llano C:

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

      NSString *my_string = @"Line1 "
                             "Line2";    // the second @ is optional
      
  2. Usando \- se puede usar para cualquier expresión:

    • Llano C:

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

      NSString *my_string = @"Line1 \
                              Line2";
      

El primer enfoque es mejor porque no se incluyen muchos espacios en blanco. Sin embargo, para una consulta SQL, ambas cosas son posibles.

NOTA: Con un #define, hay que agregar un extra \para concatenar las dos cadenas:

Llano C:

#define kMyString "Line 1"\
                  "Line 2"
Georg Schölly avatar Apr 28 '2009 11:04 Georg Schölly

Hay un truco que puedes hacer con el preprocesador.
Tiene el potencial inconveniente de colapsar los espacios en blanco y podría resultar confuso para las personas que leen el código.
Pero tiene la ventaja de que no es necesario escapar de las comillas dentro de él.

#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
);

el preprocesador convierte esto en:

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

Utilicé este truco cuando escribía algunas pruebas unitarias que tenían cadenas literales grandes que contenían JSON. Significaba que no tenía que escapar de cada carácter de comillas \".

Nicholas Daley-Okoye avatar Aug 01 '2013 14:08 Nicholas Daley-Okoye