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:
char *my_string = "Line 1 " "Line 2";
목표-C:
NSString *my_string = @"Line1 " "Line2"; // the second @ is optional
사용.
\
- 모든 식에 사용할 수 있습니다.플레인 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에서 표준화될 때까지 가만히 기다리면 됩니다.
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
'programing' 카테고리의 다른 글
Vue 3 Modal이 다시 열 때 이전 데이터를 가지고 돌아오다 (0) | 2022.07.28 |
---|---|
C코드로 ":-!"가 뭐죠? (0) | 2022.07.28 |
VueJs - 데이터 변경 시 아래로 스크롤하는 방법 (0) | 2022.07.28 |
VueJS 구성 요소에서 중복 이벤트를 내보냅니다. (0) | 2022.07.28 |
Vuex: 상태가 업데이트되지만 계산된 속성이 업데이트되지 않음 (0) | 2022.07.28 |