C 및 C ++는 인접한 문자열 리터럴을 단일 문자열 리터럴로 컴파일합니다. 예를 들면 다음과 같습니다.
"Some text..." "and more text"
다음과 같습니다.
"Some text...and more text"
C # 또는 Java와 같은 다른 C 계열 언어에서는 구문 오류입니다 (BTW는 완벽하게 좋습니다).
C와 C ++가 이것을하는 근거 / 역사적 이유는 무엇입니까?
C 및 C ++는 인접한 문자열 리터럴을 단일 문자열 리터럴로 컴파일합니다. 예를 들면 다음과 같습니다.
"Some text..." "and more text"
다음과 같습니다.
"Some text...and more text"
C # 또는 Java와 같은 다른 C 계열 언어에서는 구문 오류입니다 (BTW는 완벽하게 좋습니다).
C와 C ++가 이것을하는 근거 / 역사적 이유는 무엇입니까?
답변:
원래 C 언어는 컴퓨팅이 여전히 80 컬럼 펀치 카드에 의해 지배 된 1969-1972 년에 설계되었습니다. 디자이너들은 ASR-33 Teletype과 같은 80 개의 컬럼 장치를 사용했습니다. 이 장치는 텍스트를 자동으로 줄 바꿈하지 않았으므로 소스 코드를 80 열 내에 유지하는 실질적인 동기가있었습니다. Fortran과 Cobol은 마침내 자유 형식으로 이동하기 전에 명시적인 연속 메커니즘을 사용했습니다.
Dennis Ritchie는 문법에 모호함이 없으며 컴파일러가 인접한 리터럴 문자열을 연결하는 간단한 편의를 통해 긴 ASCII 문자열을 80 열에 맞출 수 있음을 깨달았습니다. 수많은 C 프로그래머들이이 작은 기능에 대해 감사했습니다.
기능이 들어간 후에 왜 제거 되었습니까? 슬픔을 일으키지 않으며 종종 편리합니다. 더 많은 언어가 있었으면 좋겠다. 현대의 추세는 삼중 따옴표 나 다른 기호로 확장 된 문자열을 갖는 것이지만 C에서이 기능의 단순성은 결코 끝나지 않았습니다.
C에는 +
C # 및 Java와 같은 특정 문자열 연결 연산자 ( ) 가 없습니다 . C # 또는 Java에서 컴파일러에서
"a" + "b"
마치 마치 코드를 정확하게 컴파일 할 수 있습니다
"ab"
소스 코드로 작성되었습니다. 그러나 C에서는 컴파일러가 인식하고 사전 계산할 수있는 문자열 연결을 설명하기위한 비슷한 구문이 없습니다. 수십 년 전 C의 디자이너들은
"a" "b"
와 정확히 같은 것을 의미합니다
"ab"
당연히 C ++도 같은 규칙을 물려 받았습니다. 표준 C ++ 라이브러리 과부하 반면 +
에 std::string
평균 문자열 연결로는, 컴파일러가 합체 시도하지 않습니다 "a" + "b"
그 오류가 실제로 있기 때문에 (두 개의 추가 할 수 없습니다 const char *
포인터를 함께 참조).
+
어떻게 든 연결을 의미 하더라도 연결된 문자열이 메모리에서 어디로 이동하는지 문제를 해결해야합니다.
#define FOO "foo-value"
나중에 다음"FOO's value is " FOO "."