[c] 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";

오류가 발생했습니다.

여러 줄로 쿼리를 작성하는 방법이 있습니까?



답변

문자열을 여러 줄로 나누는 방법에는 두 가지가 있습니다.

사용하여 \

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"


답변

전처리기로 할 수있는 트릭이 있습니다.
그것은 공백을 무너 뜨릴 가능성이 있으며 코드를 읽는 사람들에게 혼란을 줄 수 있습니다.
그러나 인용 부호를 피할 필요가 없다는 장점이 있습니다.

#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-> 환경 설정으로 이동하여 들여 쓰기 탭을 선택한 다음 줄 바꿈을 켤 수도 있습니다.

그렇게하면 추가로 입력 할 필요가 없으며 이미 쓴 내용에 적합합니다. 🙂

하나의 성가신 것은 …

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/

이것이 시간을 절약하기를 바랍니다.


답변

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


답변

당신은 또한 할 수 있습니다 :

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