¿Cómo dividir una cadena literal en varias líneas en C/Objective-C?
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?
Hay dos formas de dividir cadenas en varias líneas:
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
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"
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 \".