C / Objective-Cで文字列リテラルを複数行に分割する方法は?

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

\

の使用

C のすべての行は、\ を使用して複数の行に分割できます。

プレーン C:

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

Objective-C:

NSString *my_string = @"Line1 \
                        Line2";

より良いアプローチ

文字列に対してのみ機能する、より良いアプローチがあります。

プレーン C:

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

Objective-C:

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

空白があまり含まれないため、2 番目の方法の方が適しています。ただし、SQL クエリの場合は両方とも可能です。

注:#define では、2 つの文字列を連結するために余分な '\' を追加する必要があります:

プレーン 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 を含む大きなリテラル文字列を含む単体テストを書いていたときに、このトリックを使用しました。つまり、すべての引用文字 \" をエスケープする必要はありませんでした。


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
}