C++23: 전처리 지시문

3510 단어 cppcpp23preprocessing
ISO 위원회는 전처리 지시문과 관련된 C++23에 대한 두 가지 제안을 수락했습니다. P2334R1#elifdef를 소개하는 것이고 #elifndefP2437R1#warning.를 소개하는 것입니다.

전처리 지시어란 무엇입니까?



먼저 전처리 또는 전처리 지시문이 무엇인지 논의해 봅시다. 헤더 및 구현 파일 모두에 포함될 수 있으며 # 기호로 시작합니다. 이러한 줄은 컴파일이 시작되기 전에 그리고 이름에서 알 수 있듯이 전처리기에 의해 수행되는 검사 및 해결됩니다. 이러한 지시문은 한 줄 길이이고 새 줄로 끝나므로 세미콜론이 필요하지 않습니다. 더 긴 지시문을 원하는 경우 다음 줄에서 정의를 계속하겠다는 전처리기에 신호를 보내기 위해 줄을 \로 끝내야 합니다.

간단한 한 줄 사전 처리 지시문에 대해 생각한다면 #include 문에 대해 생각할 수 있습니다. #include 문에서 일어나는 일은 기본적으로 포함되는 파일로 텍스트가 대체된다는 것입니다.

전처리기 지시문의 또 다른 (비)유명한 사용법은 매크로입니다! 지시문#define을 사용하여 리터럴, 함수, 클래스 등에 대한 바로 가기를 도입할 수 있습니다. 문제는 컴파일이 시작되기 전에 텍스트를 대체하는 것일 뿐이라는 것입니다. 그런 다음 구문 오류가 발생하거나 디버그해야 하는 경우 컴파일된 내용이 소스 코드에 있는 내용과 텍스트가 다르기 때문에 작업이 상당히 어렵습니다. 그러나 매크로가 나쁜 이유에 대해서는 충분합니다. Read more here.

여러 줄 지시문에 대한 예를 찾고 있다면 일반적으로 다음과 같이 #define로 정의된 매크로입니다.

#define square(x) \
      ((x)        \
        *         \
      (x))        \


#elifdef 및 #elifndef



C++23은 elifdefelifndef 를 도입합니다. 흥미롭게도 이것은 WG14에서 나온 것이므로 C 언어에서 작업하는 ISO 작업 그룹입니다. 이러한 새로운 지시문은 C23의 일부가 될 예정이며 C++ 작업 그룹(WG21)은 C와 전처리기의 비호환성을 피하기 위해 이러한 변경 사항을 채택하기로 결정했습니다.

어쨌든 일부 키 입력을 저장하는 데 도움이 되며 비교적 잘 읽힙니다.

아마도 일부 헤더 가드에서 적어도 본 적이 있을 것입니다#ifndef. #ifndef identifier#if !defined(identifier)에 대한 바로 가기를 제공하고 #ifdef identifier#if defined(identifier)에 대한 속기입니다. C++ 언어에는 if 뿐만 아니라 다중 분기 조건을 지원하는 else if 도 있습니다. #if 뿐만 아니라 #elif 도 있는 전처리기 지시문 세계에서도 비슷합니다. 지금까지 비슷한 속기가 없었지만 C23 및 C++23은 이러한 다중 분기 조건부 전처리기 지시문을 사용하는 사람들의 삶을 더 쉽게 만듭니다. 사실, 더 쉬울 뿐만 아니라 더 대칭적이고 읽기 쉽습니다.

하나는 속기이고 다른 하나는 그렇지 않을 이유가 거의 없습니다.

#경고



C++23: Narrowing contextual conversions to bool에서 설명했듯이 새로운 표준이 항상 컴파일러 구현을 변경하는 것은 아닙니다. 때로는 새로운 표준이 기존 구현에 더 가까워지는 경우도 있습니다.

표준에 #warning를 도입한 경우입니다. 그것은 이미 모든 주요 컴파일러에 의해 구현되었으며 이제 C 및 C++ 표준 모두에서 이를 채택할 것입니다.

그래서 #warning는 무엇입니까? 번역을 중지하지 않고 전처리기에 의해 진단 메시지를 호출합니다. 이것이 #error#warning.의 차이점입니다. 전자는 번역을 중지하고 후자는 중지하지 않습니다.

사용법은 다음과 같습니다.

#ifndef FOO 
#warning "FOO defined, performance might be limited"
#endif


결론



약간 놀랍겠지만 C++23(및 C23)에서는 전처리기 지시문이 변경되었습니다. #elifdef#elifndef 의 도입으로 언어는 이미 #ifdef#ifndef 와 같이 더 둥글어지고 #warning 의 표준화로 인해 표준이 컴파일러 구현에 더 가까워졌습니다.
#include 및 헤더 구라드 외에 전처리기 지시문을 얼마나 자주 사용합니까?

더 깊은 연결



이 글이 마음에 드셨다면
  • 좋아요 버튼을 누르고,

  • subscribe to my newsletter
  • 그리고 연결합시다!
  • 좋은 웹페이지 즐겨찾기