350

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

我收到一个错误。

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

4

9 回答 9

609

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

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

    • 普通C:

      char *my_string = "Line 1 "
                        "Line 2";
      
    • 目标-C:

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

    • 普通C:

      char *my_string = "Line 1 \
                         Line 2";
      
    • 目标-C:

      NSString *my_string = @"Line1 \
                              Line2";
      

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

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

普通C:

#define kMyString "Line 1"\
                  "Line 2"
于 2009-04-28T11:10:34.770 回答
123

你可以用预处理器做一个技巧。
它有可能会折叠空白,并且可能会使阅读代码的人感到困惑。
但是,它的好处是您不需要在其中转义引号字符。

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

于 2013-08-01T14:30:19.500 回答
25

您也可以进入 XCode -> Preferences,选择 Indentation 选项卡,然后打开 Line Wrapping。

这样,您就不必输入任何额外的内容,并且它适用于您已经编写的内容。:-)

不过,一件烦人的事是……

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
}
于 2010-06-15T23:08:47.010 回答
25

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

http://multilineobjc.herokuapp.com/

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

于 2012-06-27T02:14:09.610 回答
20

扩展Objective-C的报价理念:

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

NSString *sql = NSStringMultiline(
    SELECT name, age
    FROM users
    WHERE loggedin = true
);
于 2014-04-30T12:05:28.080 回答
7

另一种解决方案,将您的 .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";
于 2017-06-02T20:49:24.053 回答
4

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

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

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

主程序

#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 上测试。

于 2019-02-07T14:56:24.930 回答
3

你也可以这样做:

NSString * query = @"SELECT * FROM foo "
                   @"WHERE "
                     @"bar = 42 "
                     @"AND baz = datetime() "
                   @"ORDER BY fizbit ASC";
于 2010-06-09T15:44:22.633 回答
0

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

于 2020-02-06T16:34:21.300 回答