2010-12-10 3 views
3

실수로 이것을 썼을 때 뭔가를 알아 내려고했습니다printf ("string1" "string2")는 유효한 C입니까?

놀랍게도 컴파일 된 문자열 출력이 생성되었습니다.

string1string2 

유효한 C입니까?

gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)

을 사용하고 있습니다.
+1

는 멋진 아닌가? :) –

답변

7

예입니다. 연속 스트링 리터럴

6.4.5/4 C.

의 분석 초기에 연접되어

번역 단계 6에서, 인접하는 문자와 문자의 토큰은 다양한 캐릭터 중 어느 시퀀스에 의해 지정된 다중 바이트 문자 시퀀스 단일 멀티 바이트 문자 시퀀스로 연결됩니다. 토큰 중 하나에 넓은 문자열 리터럴 토큰이 있으면 결과로 나오는 다중 바이트 문자 시퀀스는 넓은 문자열 리터럴로 처리됩니다. 그렇지 않으면 문자 스트링 리터럴로 취급됩니다.

2

네,이 유효하고 (처음부터하지 않은 경우) 매우 긴 시간 동안 C 언어의 일부가되었습니다. 연결은 컴파일시에 수행됩니다.

1

다른 말로, 그렇습니다. 몇 줄을 채우는 긴 문자열을 입력하는 것이 정말 유용하다는 것을 덧붙이고 싶었습니다. 당신은 문자열이 계속 표시하기 위해 \로 엉망이없는, 너무 캐리지 리턴을 추가하고자하지 않기 때문에 그냥 쓰기 :

"very long string " 
"that continues over here" 

(각 문자열의 끝에있는 공백을 조심 이 경우에는 "string"과 "that"이 합쳐집니다.)

3

예, 컴파일시 문자열 상수를 연결하는 것이 매우 유용 할 수 있습니다.

#define VERSION "1.0" 
#define COMPANY "Trivial Software" 

printf("hello world: v. " VERSION " copyright (c) " COMPANY); 

또는

puts(
    "blah blah blah\n" 
    "blah blah blah\n" 
    "blah blah blah\n" 
    "blah blah blah\n" 
); 
+0

니스. 네, 저도 그걸 사용했습니다. –