C와 C++ # include 디렉티브에서 백슬래시를 사용할 수 있습니까?
일반적으로 사용되는 경로 구분 기호는 유닉스 순방향 슬래시와 도스 백슬래시입니다.Rest in peace, Classic Mac colon. #include 디렉티브에 사용되는 경우 C++11, C++03 및 C99 표준의 규칙에 따라 동일합니까?
C99는 (§ 6.4.7/3)을 말합니다.
문자 ', \, ", // 또는 /*가 < 및 > 구분 기호 사이의 순서로 발생하는 경우 동작은 정의되지 않습니다.마찬가지로 ', \, // 또는 /* 문자가 " 구분 기호 사이의 순서로 발생하면 동작이 정의되지 않습니다.
(계속:따라서 이스케이프 시퀀스와 유사한 문자 시퀀스는 정의되지 않은 동작을 유발합니다.)
C++03은 (§2.8/2) 다음과 같이 말합니다.
문자 ' 또는 \ 또는 /* 또는 // 문자 시퀀스 중 하나가 q-char-sequence 또는 h-char-sequence에 나타나거나 "" 문자가 h-char-sequence에 나타나면 동작이 정의되지 않습니다.
(계속:따라서 이스케이프 시퀀스와 유사한 문자 시퀀스는 정의되지 않은 동작을 유발합니다.)
C++11은 (§2.9/2) 다음과 같이 말합니다.
q-char-sequence 또는 h-char-sequence에서 /* 또는 // 문자 시퀀스 중 하나의 문자 또는 \ 또는 문자 시퀀스 중 하나의 문자의 출현은 h-char-sequence에서 "의 출현과 마찬가지로 구현 정의된 의미론으로 조건부로 지원됩니다.
(계속:따라서 이스케이프 시퀀스와 유사한 일련의 문자는 구현에 따라 오류가 발생하거나 이스케이프 시퀀스에 해당하는 문자로 해석되거나 완전히 다른 의미를 가질 수 있습니다.)
할 수 있지만, 백슬래시는 백슬래시를 지원합니다.#include경로. 컴파일러 공급업체가 슬래시를 지원하지 않을 것이며 백슬래시는 이스케이프 코드를 형성하기 때문에 일부 구현을 중단시킬 수 있습니다. (편집: MSVC는 이전에 백슬래시가 필요했습니다.)아마도 도스에서 파생된 플랫폼의 다른 것들도 비슷했을 것입니다.흠… 뭐라고 말할 수 있을까요?)
C++11은 규칙을 느슨하게 하는 것처럼 보이지만, "조건부 지원"이 "정의되지 않은 행동을 유발"하는 것보다 의미 있게 더 나은 것은 아닙니다.이러한 변화는 휴대용 표준을 설명하는 것보다 인기 있는 특정 컴파일러의 존재를 반영하는 데 더 큰 역할을 합니다.
물론, 이러한 기준 중 어떤 것도 경로와 같은 것이 있다고 말하지 않습니다.경로가 전혀 없는 파일 시스템이 있습니다!그러나 대부분의 라이브러리는 POSIX 및 Boost를 포함하여 경로 이름을 가정하므로 하위 디렉터리 내의 파일을 참조하는 휴대용 방법을 사용하는 것이 좋습니다.
슬래시는 올바른 방법입니다. 사전 컴파일러는 각 플랫폼에서 올바른 파일로 이동하는 데 필요한 모든 작업을 수행합니다.
그것은 당신이 "허용할 수 있다"는 것을 의미하는 것에 달려 있습니다.
슬래시는 허용되고 백래시는 허용되지 않는 두 가지 의미가 있습니다.
C99, C++03 또는 C1x를 작성하는 경우 백슬래시는 정의되지 않은 반면 슬래시는 합법적이므로 백슬래시는 허용되지 않습니다.
하지만 이것은 대부분의 사람들에게 관련이 없습니다.백슬래시가 조건부로 지원되는 C++1x를 작성하고 있으며, 백슬래시를 코딩하고 있는 플랫폼이 백슬래시를 지원하는 경우 이를 사용할 수 있습니다.그리고 백슬래시를 정의하는 C99/C++03/C1x의 "확장 방언"을 작성하는 경우에도 마찬가지입니다.그리고 더 중요한 것은, 이 "수용 가능한" 개념은 어쨌든 대부분의 경우에 꽤 의미가 없다는 것입니다.C/C++ 표준 중 슬래시가 의미하는 것(또는 조건부 지원 시 백슬래시가 의미하는 것)을 정의하는 것은 없습니다.헤더 이름은 구현 정의 방식(기간)으로 소스 파일에 매핑됩니다.파일 계층이 있는데 #include 디렉티브에서 백슬래시 또는 슬래시를 사용하여 파일을 휴대용으로 참조할 것인지 묻는 경우 답은 둘 다 휴대용이 아니라는 것입니다.진정한 휴대용 코드를 작성하려면 헤더 파일의 계층 구조를 사용할 수 없습니다. 사실상 표준 헤더를 제외한 모든 항목을 #포함하지 않고 단일 소스 파일에 기록하는 것이 최선입니다.
하지만, 현실 세계에서 사람들은 종종 "엄격한 휴대용"이 아닌 "충분히 휴대용"을 원합니다.POSIX 표준은 슬래시가 무엇을 의미하는지를 규정하고 있으며, POSIX 이외에도 Win32(및 Win64), 심비안과 같은 임베디드 및 모바일 플랫폼용 크로스 컴파일러 등을 포함한 대부분의 최신 플랫폼에서 POSIX 방식으로 슬래시를 처리합니다. 적어도 C/C++ #가 지시를 포함하는 한 말입니다.소스 트리를 가져와 메이크 파일/프로세스 등을 처리할 수 있는 방법이 없는 플랫폼이라면 #include 디렉티브는 걱정할 필요가 없습니다.그런 경우 슬래시는 허용되지만 백슬래시는 허용되지 않습니다.
블랙슬래시는 정의되지 않은 동작이며 슬래시가 있더라도 주의해야 합니다.C99 표준은 다음을 명시합니다.
문자 ', \, ", // 또는 /*가 < 및 > 구분 기호 사이의 순서로 발생하는 경우 동작은 정의되지 않습니다.마찬가지로 ', \, // 또는 /* 문자가 " 구분 기호 사이의 순서로 발생하면 동작이 정의되지 않습니다.
항상 슬래시를 사용하십시오. 슬래시는 더 많은 플랫폼에서 작동합니다.백슬래시는 기술적으로 C++03에서 정의되지 않은 동작을 발생시킵니다(표준에서는 2.8/2).
#에 대한 표준은 다음을 포함합니다.
에서는 구분 기호 사이의 지정된 순서로 고유하게 식별되는 헤더에 대한 구현 정의 플레이스 시퀀스를 검색하고 헤더의 전체 내용으로 해당 지시어를 바꿉니다.플레이스가 지정되거나 헤더가 식별되는 방법은 구현 정의됩니다.
마지막 문장을 메모합니다.
언급URL : https://stackoverflow.com/questions/5790161/is-the-backslash-acceptable-in-c-and-c-include-directives
'programing' 카테고리의 다른 글
| Typescript 3.0에서 Tuple을 다른 Tuple 유형으로 '매핑'하는 방법 (0) | 2023.07.11 |
|---|---|
| Python 문자열이 [u'String']으로 인쇄됨 (0) | 2023.07.11 |
| Android: 버튼 또는 이미지 버튼의 텍스트와 이미지 결합 (0) | 2023.07.06 |
| redistrepect_cast의 C에 해당하는 것은 무엇입니까? (0) | 2023.07.06 |
| Flask dev 서버를 실행하는 이유는 무엇입니까? (0) | 2023.07.06 |