C ++에서 식별자에 범용 문자 이름을 사용하는 것


11

로 기록 보편적 인 캐릭터 이름, 지정하는 C ++ 표준 (I 새로운 하나를 발견하지만, 이미했던 03 ++ C에 존재) \uNNNN\UNNNNNNNN와 유니 코드 코드 포인트와 문자를 나타내는를 NNNN/ NNNNNNNN. 이는 명시 적으로 UTF-8, UTF-16 및 UCS-4 문자열 리터럴도 정의되므로 문자열 리터럴에 유용합니다. 그러나 범용 문자 리터럴도 식별자에 사용할 수 있습니다. 그 배후의 동기는 무엇입니까?

구문은 분명히 읽을 수 없으며, 링커에 대해 식별자가 엉망이 될 수 있으며 어쨌든 이름으로 기호를 검색하는 표준 함수가 아닙니다. 그렇다면 왜 실제로 누군가가 보편적 인 문자 리터럴을 가진 식별자를 사용 하는가?

편집 : 실제로 C ++ 03에 이미 존재했기 때문에 실제로 사용하는 코드를 보았는지 여부에 대한 추가 질문이 있습니까?

답변:


6

업데이트 -이 답변은 나와 다른 사람들에게 의미가있는 것처럼 보이지만 크게 틀린 것으로 나타났습니다 (의도에 관해서는 충분히 잘못되었습니다). (AProgrammer에 의해 코멘트와 같이 뾰족한 아웃) 때문에 그건 하지 같은 문자가 기본 문자 세트에 일반적으로 표현 될 수있을 때 문자열 상수의 UCS의 외부 사용이 허용. 예를 들어 키워드를 이스케이프 처리하는 데 사용하지 마십시오. 23skiddo이스케이프를 피하여 '식별자'를 만드는 데 사용하지 않습니다 .2. 그것은 여전히 ​​외부 언어와 호환되는 이름을 만드는 데 사용될 수 있지만, 그 이름은 문자 또는 확장 문자로 시작하고 문자, 숫자, 밑줄 및 확장 문자 만 포함 할 때만 보입니다. 그 의도를 제대로지지하기에는 너무 제한적인 것 같습니다. 따라서 주요 의도는 (AProgrammer의 답변에서와 같이) 식별자에 이러한 추가 문자를 허용하고 이러한 문자가 그래픽으로 표시되는 소스 편집기를 활성화하는 동시에 소스 파일이 일반 ASCII로 유지되도록하는 것이어야합니다.


C ++ 프로그램은 다른 언어로 작성된 함수를 호출 할 수 있습니다. 표준화위원회에서 C ++이 다른 언어와 상호 운용 가능하도록 보장하는 것이 좋습니다. 이러한 언어는 아직 존재하지 않더라도 영숫자가 아닌 함수 이름에 유니 코드 문자를 사용할 수 있습니다. 표준에서는 링커 수준 등에서 이것이 작동하는 방식을 지정할 필요가 없습니다. 그러나이를 허용하기 위해 지정된 메커니즘을 갖추는 것이 좋습니다.

이를 위해 미래를 들여다 볼 필요는 없습니다. 호출 된 catch(또는 보호되거나 변경 가능한) 함수가있는 오래된 C 라이브러리가 있다고 가정 하고 C ++에서 호출하려고합니다. 그리고 어떤 이유로 든 C 코드를 수정할 수 없거나 수정하고 싶지 않습니다 (그런데 C ++ 키워드가 된 함수 이름을 사용하는 오래된 C 코드를 두 번 이상 처리해야했습니다 ...)

UC 이름으로 헤더에 이것을 작성한 다음 'catch_func ()'를 호출하면됩니다.

extern "C" {
       int catc\u0068( int a, int b );  // C 'catch()' function
}
inline int catch_func( int a, int b ) { return catc\u0068(a,b); }

그것은 추악하지만 헤더의 한 위치에만 있기 때문에 중요하지 않습니다. 동일한 접근 방식을 사용하여 다른 언어로 함수를 호출하는 스텁을 만들 수 있으며, 이름이 C ++ 키워드 또는 유니 코드이거나 공백 .또는 기타 문장 부호가 포함 된 경우에도 작동합니다.

다른 여러 언어에는 일반적인 패턴을 따르지 않는 식별자를 만들 수있는 장치가 있습니다. 에서 Verilog를 들면, \abcd행 식별자 동등 abcd하지만, \while\23skidoo\44.e2같은 볼 수 슬래시 프리픽스 필요도 식별자이다. Verilog가 사용되는 방식으로 인해 외부 인터페이스와 관련된 이름을 허용하는 것이 중요합니다.


재미있는 사용 사례. (가능한 경우) 이름을 번역하고 C ++ 식별자를 사용할 수있는 작은 C 파일을 작성하고 C ++에서 C 함수를 호출하는 것이 더 좋을 것입니다.
Thomas Eding

1
두 가지 이유로 인해 첫 번째 UCS 외부 문자열 및 문자 리터럴은 프로그램을 잘못 작성하지 않고 기본 세트의 문자를 참조 할 수 없으며 두 번째 이유는 해당 절이 존재하지 않으면 UCS는 번역의 1 단계에서 처리됩니다. 따라서 기본 세트의 문자를 참조하는 UCS와 문자 자체 사이의 처리에는 차이가 없습니다.
AProgrammer

4

식별자의 유니 코드 문자를 허용하는 시스템은 표준 준수 컴파일러에서 컴파일 가능한 형식으로 소스를 내보낼 수 있습니다. IE는 기본 문자 세트를 통해 유니 코드를 인코딩하는 방법입니다 (따옴표로 묶은 인쇄 가능이 전자 메일, 더 잘 알고있는 시스템은 더 나은 작업을 수행 할 수 있으며 다른 시스템은 여전히 ​​작동 함).


2

키보드 나 입력 장치에서 입력 할 수없는 외국어 문자를 사용하여 식별자를 만들려고 할 수 있습니다. 또는 식별자에는 장치의 글꼴이나 출력 기능을 사용하여 인쇄 할 수없는 문자가 포함될 수 있지만 IDE는 정확한 표현을 보여 주려고합니다.


4
첫 번째 경우, 식별자는 해당 문자를 갖는 것처럼 보이지 않으므로 코드를 읽을 수 없으며 식별자는 실제로 기계에 중요하지 않습니다. 그리고 두 번째로, IDE에서의 표현은 완전히 별개의 문제입니다.
Jan Hudec

1

C ++에서는 소스에 문자 그대로 나타나는 실제 확장 문자가 범용 문자 이름과 동일하게 작동해야합니다. 식별자에 범용 문자 이름을 허용하면 프로그래머가 식별자에 확장 문자를 사용할 수 있습니다.


실제 확장 문자가 지원되므로 해당되는 범용 문자로 동작해야합니다. 그러나 지원할 필요는 없습니다.
Jan Hudec

1
사실이지만,위원회가 확장 문자를 지원하는 구현이 식별자에 해당 문자를 사용하도록 지원해야한다고 지정하려는 경우 UCN이 식별자에 허용되도록 요구합니다. 즉, UCN은 읽을 수 있고 모든 사람이 수동으로 16 진수로 이름을 인코딩하는 것을 좋아하기 때문에 식별자에 허용되지는 않지만 사양에서 확장 문자를 식별자에 사용할 수있게하려면 UCN이 식별자에 허용되도록 지정하면됩니다.
bames53
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.