Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++ 전처리기 지시문 총정리: 조건부 컴파일부터 #line, #error까지

C나 C++ 소스 코드를 보면 (#) 기호로 시작하는 문장들을 종종 발견하게 됩니다. 이것이 바로 전처리기 지시문(Preprocessing Directives)입니다. 이러한 지시문은 실제 컴파일이 시작되기 전에 진행되는 '전처리 단계'에서 처리되며, 코드 생성 과정에 중요한 역할을 합니다.

이번 글에서는 대표적인 전처리기 지시문 세 가지 유형을 살펴보겠습니다.

  • 조건부 컴파일(Conditional Compilation)
  • 라인 제어(Line Control)
  • 오류 지시문(Error Directive)

1. 조건부 컴파일 (#ifdef, #elif, #else, #endif)

프로그램 내에서 매크로를 정의할 때가 많습니다. 조건부 컴파일 지시문을 사용하면 특정 매크로가 정의되어 있는지 여부를 검사하고, 그 결과에 따라 서로 다른 코드를 실행하도록 제어할 수 있습니다. 즉, 어떤 매크로가 정의되어 있으면 A 작업을 수행하고, 그렇지 않으면 B 작업을 수행하는 식의 분기 처리가 가능합니다.

조건부 컴파일은 #ifdef#elif#else#endif 형태로 구성됩니다. 주의할 점은 모든 #ifdef 블록은 반드시 #endif로 닫아야 하며, #elif#else는 선택 사항이라는 것입니다.

예제 코드

#include <iostream>
#define MY_MACRO 10
using namespace std;
int main() {
   #ifdef MACRO
   cout << "MACRO is defined" << endl;
   #elif MY_MACRO
   cout << "MY_MACRO is defined, value is: " << MY_MACRO;
   #endif
}

실행 결과

MY_MACRO is defined, value is: 10

위 예제에서는 MACRO라는 매크로는 정의되어 있지 않지만 MY_MACRO는 값 10으로 정의되어 있으므로, #elif 블록의 코드가 실행된 것을 확인할 수 있습니다.

2. 라인 제어 지시문 (#line)

#line 지시문은 컴파일러가 인식하는 줄 번호를 임의로 변경할 때 사용합니다. 때로는 원하는 줄 번호와 함께 에러 메시지가 출력되는데, 이 지시문을 활용하면 줄 번호를 직접 업데이트할 수 있습니다. 예를 들어 현재 위치에서 줄 번호를 200으로 변경하면, 그 이후의 코드들은 201번부터 순차적으로 번호가 매겨집니다.

예제 코드

#include <iostream>
using namespace std;
int main() {
   cout<< "Current line is: " << __LINE__ << endl;
   #line 200
   cout << "Hello" << endl;
   cout << "World" << endl;
   cout<< "Current line is: " << __LINE__ << endl;
}

실행 결과

Current line is: 5
Hello
World
Current line is: 202

출력 결과를 보면 #line 200 지시문 이후 줄 번호가 재설정되어, 마지막 __LINE__ 매크로가 202를 반환한 것을 알 수 있습니다.

3. 오류 지시문 (#error)

#error 지시문은 컴파일이 진행되기 전에 의도적으로 오류를 발생시켜 메시지를 표시할 때 사용합니다. 예를 들어 특정 매크로가 반드시 정의되어야 하는 상황에서 해당 매크로가 정의되어 있지 않다면, 명확한 오류 메시지를 출력해 개발자에게 알릴 수 있습니다.

예제 코드

#include <iostream>
using namespace std;
int main() {
   #ifdef MY_MACRO
   cout << "MY_MACRO is defined, value is: " << MY_MACRO;
   #else
   #error MY_MACRO should be defined
   #endif
}

실행 결과

#error MY_MACRO should be defined

MY_MACRO가 정의되어 있지 않기 때문에 컴파일 시점에 "MY_MACRO should be defined"라는 오류 메시지가 출력되며 빌드가 중단됩니다. 이처럼 #error는 필수 설정 누락 등을 사전에 방지하는 안전 장치로 매우 유용합니다.

마무리

전처리기 지시문은 컴파일 전 단계에서 코드를 유연하게 제어할 수 있는 강력한 도구입니다. 조건부 컴파일로 플랫폼별·디버그용 코드를 관리하고, #line으로 줄 번호를 제어하며, #error로 필수 조건을 강제함으로써 더 견고하고 유지보수하기 쉬운 프로그램을 작성할 수 있습니다.