如何在C / Objective-C中跨多行拆分字符串文字?

时间:2009-04-28 11:01:51

标签: 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";

如何在多行中打破它以便于阅读? 如果我执行以下操作:

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

我收到了错误。

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

9 个答案:

答案 0 :(得分:538)

有两种方法可以在多行上分割字符串:

使用\

使用\。

可以将C中的所有行拆分为多行

普通C:

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

目标-C:

NSString *my_string = @"Line1 \
                        Line2";

更好的方法

有一种更适合字符串的方法。

普通C:

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

目标-C:

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

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

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

普通C:

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

答案 1 :(得分:101)

您可以使用预处理器进行操作 它有潜在的缺点,它会崩溃白色空间,并且可能会让阅读代码的人感到困惑 但是,它有一个好处,你不需要在其中转义引号字符。

#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的大型文字字符串的单元测试时,我已经使用过这个技巧。这意味着我不必逃避每个引用字符\“。

答案 2 :(得分:24)

你也可以进入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
}

答案 3 :(得分:19)

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

http://multilineobjc.herokuapp.com/

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

答案 4 :(得分:18)

扩展Objective-C的Quote想法:

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

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

答案 5 :(得分:5)

另一个解决方案,将.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";

答案 6 :(得分:3)

你也可以这样做:

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

答案 7 :(得分:0)

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

C ++ 11具有原始字符串文字,如https://stackoverflow.com/a/44337236/895245

所述

但是,GCC还将它们添加为C扩展名,您只需要使用-std=gnu99而不是-std=c99。例如:

main.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代码:How to write multiline inline assembly code in GCC C++?

现在,您只需要退而求其次,等待它在C20XY上标准化。

在以下位置询问C ++:C++ multiline string literal

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

答案 8 :(得分:0)

另一种方法是使用任何工具删除换行符。使用任何文本编辑器编写字符串,完成后,粘贴文本here,然后再次将其复制到xcode中。