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

文字列を複数行に分割するには、次の 2 つの方法があります。

  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 クエリの場合は、両方が可能です。

注: を使用すると、2 つの文字列を連結#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

私はいつもこの問題を抱えているので、テキストをエスケープされた複数行のObjective-C文字列に変換する小さなツールを作成しました。

http://multilineobjc.herokuapp.com/

これで時間を節約できれば幸いです。

于 2012-06-27T02:14:09.610 に答える
25

XCode -> Preferences に移動し、[Indentation] タブを選択して、[Line Wrapping] をオンにすることもできます。

そうすれば、余分なものを入力する必要がなくなり、すでに書いたものに対して機能します。:-)

面倒なことの1つですが...

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 に答える
3

次のこともできます。

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