IDL 파일에서 #defines 처리
이 페이지에서는 #define 사용하여 정의된 기호가 MIDL 컴파일러에서 생성된 H 파일에서 사라지는 이유와 이에 대해 수행할 수 있는 작업을 설명합니다. 이 설명은 *.idl, *.acf, *.h 파일 등 MIDL에서 처리되는 모든 파일에 적용됩니다.
#define 기호가 사라지는 것은 MIDL이 입력 파일의 전처리를 전처리기로 위임한 결과입니다. 기본적으로 전처리기는 빌드 환경의 C/C++ 전처리기입니다. 전처리 후 MIDL이 수신하는 입력 스트림에는 #line 전처리기 지시문만 있습니다. 특히 전처리기는 입력 파일의 모든 매크로 정의를 언롤하므로 MIDL에서 해당 존재를 감지할 수 없습니다. 따라서 MIDL이 입력 파일에서 생성된 H 파일로 형식 정의를 복제하는 경우 #defines 복제되지 않습니다. 따라서 나중에 생성된 H 파일에서 사용할 경우 IDL 파일에서 직접 #defines 사용하지 마세요.
다음 네 가지 해결 방법을 사용하는 것이 좋습니다.
- const 선언 사양을 사용합니다.
- IDL 파일에 가져오거나 포함하고 나중에 C 소스 코드에 포함된 별도의 헤더 파일을 사용합니다.
- IDL 파일에서 열거형 상수를 사용합니다.
- cpp_quote 사용하여 생성된 헤더 파일의 #define 재현합니다.
IDL constant-declaration 구문을 사용하여 매니페스트 상수를 재현할 수 있습니다. IDL 상수 선언의 const 는 C/C++ const 의미 체계와 다르며 단순히 IDL 컴파일에 명명된 상수를 도입합니다. 예:
const short ARRSIZE = 10
이 예제에서는 ARRSIZE 가 값이 10인 상수임을 지정합니다. 명명된 상수는 IDL 배열 선언자 및 C 프로그래머가 매니페스트 정의를 사용하는 다른 위치에서 사용할 수 있습니다. 또한 이 구문은 헤더 파일에서 다음 줄이 생성됩니다.
#define ARRSIZE 10
**#**define 문을 처리하는 또 다른 방법은 **#**define 문 전용 파일이나 형식 정의만 포함된 파일로 별도의 헤더 파일에 패키지하는 것입니다. 전처리기 지시문만 포함하는 파일은 IDL 파일과 C 소스 파일 모두에 안전하게 포함될 수 있습니다. 지시문은 MIDL 컴파일러에서 생성된 헤더 파일에서 사용할 수 없지만 C 소스 프로그램에는 별도의 헤더 파일이 포함될 수 있습니다. 비슷한 방식으로 **#**define 문과 일반 형식 정의가 있는 헤더 파일을 IDL 파일에서 가져올 수 있습니다. 이 방법은 **#**정의 기호가 가져오는 IDL 파일에 직접 사용되지 않도록 H 파일에서 이를 사용하여 **#**define 및 typedef 문을 캡슐화합니다. 헤더 또는 IDL 파일을 다른 IDL 파일로 가져오면 typedef 문이 MIDL에서 생성된 H 파일로 복제되지 않습니다(**#**include 문과는 대조적임). 이 방법을 사용하면 중복된 정의에 문제가 없어도 생성된 H 파일을 따라 C 코드에서 원본 헤더 파일을 안전하게 참조할 수 있습니다.
IDL 파일에서 열거형 상수를 사용하는 것도 효과적입니다. 이러한 상수는 IDL의 상수 식(예: 배열 선언자)에서 사용할 수 있습니다. 열거형 상수는 C-컴파일러 전처리기에서 MIDL 컴파일 초기 단계에서 제거되지 않으므로 MIDL 컴파일러에서 생성된 헤더 파일에서 열거형 상수를 사용할 수 있습니다. 다음과 같은 문이 있습니다.
typedef enum midlworkaround { MAXSTRINGCOUNT = 300 };
이 문은 C 전처리기에서 MIDL 컴파일 중에 제거되지 않으며 typedef는 생성된 H 파일에 복제됩니다. 상수 MAXSTRINGCOUNT는 MIDL 컴파일러에서 생성된 헤더 파일을 포함하는 C 소스 프로그램에서 사용할 수 있습니다.
마지막으로 MIDL의 cpp_quote 지시문을 사용하여 임의의 문자열을 생성된 H 파일에 직접 쓸 수 있습니다. 예를 들어 이전에 이 페이지에서 cpp_quote 사용한 매니페스트 상수를 가져오기 위해 다음 문을 사용할 수 있습니다.
cpp_quote ("#define ARRSIZE 10")
이 문을 사용하면 헤더 파일에서 다음 줄이 생성됩니다.
#define ARRSIZE 10