인접한 문자열 리터럴 연결


17

C 및 C ++는 인접한 문자열 리터럴을 단일 문자열 리터럴로 컴파일합니다. 예를 들면 다음과 같습니다.

"Some text..." "and more text"

다음과 같습니다.

"Some text...and more text"

C # 또는 Java와 같은 다른 C 계열 언어에서는 구문 오류입니다 (BTW는 완벽하게 좋습니다).

C와 C ++가 이것을하는 근거 / 역사적 이유는 무엇입니까?

답변:


24

원래 C 언어는 컴퓨팅이 여전히 80 컬럼 펀치 카드에 의해 지배 된 1969-1972 년에 설계되었습니다. 디자이너들은 ASR-33 Teletype과 같은 80 개의 컬럼 장치를 사용했습니다. 이 장치는 텍스트를 자동으로 줄 바꿈하지 않았으므로 소스 코드를 80 열 내에 유지하는 실질적인 동기가있었습니다. Fortran과 Cobol은 마침내 자유 형식으로 이동하기 전에 명시적인 연속 메커니즘을 사용했습니다.

Dennis Ritchie는 문법에 모호함이 없으며 컴파일러가 인접한 리터럴 문자열을 연결하는 간단한 편의를 통해 긴 ASCII 문자열을 80 열에 맞출 수 있음을 깨달았습니다. 수많은 C 프로그래머들이이 작은 기능에 대해 감사했습니다.

기능이 들어간 후에 왜 제거 되었습니까? 슬픔을 일으키지 않으며 종종 편리합니다. 더 많은 언어가 있었으면 좋겠다. 현대의 추세는 삼중 따옴표 나 다른 기호로 확장 된 문자열을 갖는 것이지만 C에서이 기능의 단순성은 결코 끝나지 않았습니다.


8
또 다른 이유는 예를 들어, 문자열 리터럴로 정의 처리기 매크로의 연결은 수 있다는 것입니다 #define FOO "foo-value"나중에 다음"FOO's value is " FOO "."
Blrfl

3
@Blrfl : 그렇습니다. 매크로 대체가 완료된 후에 문자열 연결이 발생한다는 것을 인식하는 것이 중요합니다.
david.pfx

7

C에는 +C # 및 Java와 같은 특정 문자열 연결 연산자 ( ) 가 없습니다 . C # 또는 Java에서 컴파일러에서

"a" + "b"

마치 마치 코드를 정확하게 컴파일 할 수 있습니다

"ab"

소스 코드로 작성되었습니다. 그러나 C에서는 컴파일러가 인식하고 사전 계산할 수있는 문자열 연결을 설명하기위한 비슷한 구문이 없습니다. 수십 년 전 C의 디자이너들은

"a" "b"

와 정확히 같은 것을 의미합니다

"ab"

당연히 C ++도 같은 규칙을 물려 받았습니다. 표준 C ++ 라이브러리 과부하 반면 +std::string평균 문자열 연결로는, 컴파일러가 합체 시도하지 않습니다 "a" + "b"그 오류가 실제로 있기 때문에 (두 개의 추가 할 수 없습니다 const char *포인터를 함께 참조).


1
C에는 또한 특정 문자열 유형이 없으므로 메모리의 문자를 가리키는 포인터를 선택합니다. 포인터를 추가 할 수 없으며 +어떻게 든 연결을 의미 하더라도 연결된 문자열이 메모리에서 어디로 이동하는지 문제를 해결해야합니다.
Blrfl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.