如何在C / Objective-C中跨越多行分割string文字?

我有一个很长的SQLite查询:

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

我怎样才能把它分成几行以便阅读? 如果我做到以下几点:

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

我收到一个错误。

有没有办法在多行写查询?

有两种方法可以将string拆分为多行:

使用\

C中的所有行可以使用\分成多行。

平原C:

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

Objective-C的:

 NSString *my_string = @"Line1 \ Line2"; 

更好的方法

有一个更好的方法适用于string。

平原C:

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

Objective-C的:

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

第二种方法更好,因为没有太多的空白。 但是,对于SQL查询,两者都是可能的。

注意:使用#define,你必须添加一个额外的'\'连接两个string:

平原C:

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

你可以用预处理器做一个技巧。
它有潜在的缺陷,它会崩溃的空白,并可能会让人阅读代码混淆。
但是,它有好处,你不需要逃避里面的引号字符。

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

预处理器将其变成:

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

当我编写一些包含JSON的大型文字string的unit testing时,我使用了这个技巧。 这意味着我不必逃避每一个引号字符“。

你也可以进入XCode – > Preferences,selectIndentation选项卡,然后打开Line Wrapping。

这样,你就不必再input任何东西了,它可以用于你已经写的东西。 🙂

一件烦人的事情是…

 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 } 

我一直有这个问题,所以我做了一个小工具来将文本转换为一个转义的多行Objective-Cstring:

http://multilineobjc.herokuapp.com/

希望这可以为你节省一些时间。

扩展Objective-C的引用思路:

 #define NSStringMultiline(...) [[NSString alloc] initWithCString:#__VA_ARGS__ encoding:NSUTF8StringEncoding] NSString *sql = NSStringMultiline( SELECT name, age FROM users WHERE loggedin = true ); 

你也可以这样做:

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

还有一个解决scheme,把你的.m文件改成.mm文件,使它成为Objective-C ++,并使用C ++原始文字,如下所示:

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

原始文字忽略了一切,直到终止序列,在默认情况下是括号引用。 如果括号引用顺序必须出现在string的某处,那么也可以很容易地指定自定义终止符,查找C ++原始文字来查找这样做的细节(这很容易)。