programing

C/Objective-C에서 문자열 리터럴을 여러 줄로 분할하려면 어떻게 해야 합니까?

itsource 2022. 7. 28. 23:07
반응형

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

에러가 발생하고 있습니다.

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

문자열을 여러 줄로 분할하는 방법에는 다음 두 가지가 있습니다.

  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"

프리프로세서로 할 수 있는 요령이 있습니다.
백지 상태로 붕괴될 가능성이 있어 코드를 읽는 사람들에게 혼란을 줄 수 있습니다.
단, 그 안에 따옴표 문자를 피할 필요가 없는 업사이드가 있습니다.

#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을 포함하는 큰 문자열이 있는 단위 테스트를 작성할 때 이 방법을 사용했습니다.모든 인용문자를 벗어날 필요가 없다는 것을 의미했다.

항상 이 문제가 있기 때문에 텍스트를 이스케이프된 여러 줄 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
);

GCC는 C 확장자로 C++ 다중 행 원시 문자열 리터럴을 추가합니다.

C++11에는 raw 문자열 리터럴이 있습니다.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에서 테스트.

파일용 솔루션을 하나 더 준비하려면 .m 파일을 .mm로 변경하여 Objective-C++가 되도록 하고 다음과 같이 C++ raw literal을 사용합니다.

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

raw 리터럴은 종료 시퀀스가 될 때까지 모든 것을 무시합니다.디폴트의 경우는 괄호 따옴표로 둘러싸여 있습니다.

괄호 따옴표 시퀀스를 문자열에 표시할 필요가 있는 경우는, 다음과 같이 커스텀 딜리미터를 간단하게 지정할 수도 있습니다.

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

[ XCode - ]> [ Preferences ]으로 이동하여 [Inditation]탭을 선택하고 [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
}

다음 작업도 가능합니다.

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

다른 방법으로는 줄 바꿈을 제거하는 도구를 사용할 수 있습니다.텍스트 편집기를 사용하여 문자열을 작성하고 완료되면 여기에 텍스트를 붙여넣은 후 xcode로 다시 복사합니다.

언급URL : https://stackoverflow.com/questions/797318/how-to-split-a-string-literal-across-multiple-lines-in-c-objective-c

반응형