如何分割字符串文字在C / Objective-C多行?

我有一个很长的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";

我如何把它分成几行,使它更容易阅读?

. sh

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

我得到一个错误。

是否有一种方法可以在多行中编写查询?

287870 次浏览

有两种方法将字符串拆分为多行:

  1. 每个字符串在自己的行上。只适用于字符串:

    • < p >纯C:

      char *my_string = "Line 1 "
      "Line 2";
      
    • objective - c < p >:

      NSString *my_string = @"Line1 "
      "Line2";    // the second @ is optional
      
  2. Using \ -可以用于任何表达式:

    • < p >纯C:

      char *my_string = "Line 1 \
      Line 2";
      
    • objective - c < p >:

      NSString *my_string = @"Line1 \
      Line2";
      

第一种方法比较好,因为没有包含很多空白。然而,对于SQL查询,两者都是可能的。

注意:使用#define,你必须添加一个额外的\来连接两个字符串:

纯C:

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

你还可以:

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

你也可以进入XCode ->首选项,选择缩进选项卡,然后打开行换行。

这样,你就不需要输入任何额外的东西,它将适用于你已经写过的东西。: -)

但有一件事很烦人……

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-C字符串:

http://multilineobjc.herokuapp.com/

希望这能为您节省一些时间。

你可以用预处理器做一个小技巧 它有潜在的缺点,它会破坏空白,并且可能会让阅读代码的人感到困惑 但是,它也有好的一面,你不需要在里面转义引号字符

#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的大字符串的单元测试时使用过这个技巧。这意味着我不必转义每一个引用字符\”。

报价思想扩展到Objective-C:

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


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

还有一个解决方案,把你的。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)";

原始文字忽略终止序列之前的所有内容,在默认情况下,终止序列是圆括号-引号。

如果圆括号-引号序列必须出现在字符串中的某个地方,您也可以轻松地指定一个自定义分隔符,如下所示:

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

GCC将c++多行原始字符串文字作为C扩展添加

c++ 11有原始字符串字面量,如在:https://stackoverflow.com/a/44337236/895245中提到的

然而,GCC也将它们作为C扩展添加,你只需要使用-std=gnu99而不是-std=c99。例如:

c

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


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

编译并运行:

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

例如,这可以用于在C代码:如何在GCC c++中编写多行内联汇编代码?中插入多行内联程序集

现在您只需要放轻松,等待C20XY对其进行标准化。

c++被问到:c++多行字符串文字

在Ubuntu 16.04, GCC 6.4.0, binutils 2.26.1上测试。

另一种方法是使用任何工具来删除换行符。使用任何文本编辑器编写字符串,一旦完成,粘贴您的文本在这里并在xcode中再次复制它。