371 votes

Comment diviser une chaîne littérale sur plusieurs lignes en C / Objective-C ?

J’ai une requête sqlite assez longue :

Comment puis-je briser dans un certain nombre de lignes pour le rendre plus facile à lire ? Si je fais ce qui suit :

J’obtiens une erreur.

Est-il possible d’écrire des requêtes sur plusieurs lignes ?

647voto

Georg Schölly Points 63123

Il y a deux façons de diviser chaînes de caractères sur plusieurs lignes:

À l'aide de \

Toutes les lignes en C peut être divisé en plusieurs lignes à l'aide de \.

Plaine C:

char *my_string = "Line 1 \
                   Line 2";

Objective-C:

NSString *my_string = @"Line1 \
                        Line2";

Une meilleure approche

Il y a une meilleure approche qui fonctionne pour les chaînes.

Plaine C:

char *my_string = "Line 1 "
                  "Line 2";

Objective-C:

NSString *my_string = @"Line1 "
                       "Line2";    // the second @ is optional

La deuxième approche est la meilleure, car il n'y a pas beaucoup d'espaces inclus. Pour une requête SQL cependant, les deux sont possibles.

REMARQUE: Avec un #define, vous devez ajouter un supplément '\' pour concaténer deux chaînes de caractères:

Plaine C:

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

133voto

Nicholas Daley Points 201

Il y a un truc que vous pouvez faire avec le pré-processeur.
Il a le potentiel sur les côtés qu'il va s'effondrer espace blanc, et pourrait être source de confusion pour les gens qui lisent le code.
Mais, il a le côté positif que vous n'avez pas besoin d'échapper les guillemets à l'intérieur.

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

le préprocesseur se transforme en:

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

J'ai utilisé cette astuce quand j'ai écrit quelques tests unitaires qui ont de grandes chaînes de caractères littérales contenant JSON. Cela signifiait que je n'avais pas à échapper à chaque caractère de guillemet \".

25voto

DenverCoder9 Points 1648

Vous pouvez également aller dans XCode -> Préférences, sélectionnez l'onglet Indentation et activez l'habillage de ligne.

De cette façon, vous n'aurez plus à taper quoi que ce soit, et cela fonctionnera pour les choses que vous avez déjà écrites. :-)

Une chose ennuyante cependant est ...

 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 Points 3032

J'ai ce problème tout le temps, j'ai donc fait un petit outil pour convertir le texte en une chaîne multi-lignes Objective-C échappée:

http://multilineobjc.herokuapp.com/

J'espère que cela vous fait gagner du temps.

20voto

Berik Points 2450

Extension de l'idée de devis pour Objective-C:

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X