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