2016-08-24 4 views
0

저는 Windows, Unix 및 Mac 용 플랫폼 간 프로그램을 만들고 있습니다. 각 OS에 고유 한 것을 사용하려면 #define을 사용하십시오. 예를 들어 Windows 용으로 컴파일 할 때 #define WINDOWS을 사용합니다. 내가 잘못된 OS를 정의 할 때특정 라인에서 전 처리기 오류 발생

#ifndef WINDOWS 
#ifndef UNIX 
#ifndef MAC 
#error "OS must be WINDOWS, UNIX or MAC" 
#endif 
#endif 
#endif 

이있다 그것으로 나에게 오류를 제공합니다 : 존재하지 않는 OS를 정의하는 확실하지, 또는 적어도 내 프로그램에서 지원하지 않는하려면,이 사용 그래야하지만, 오류를 의미하는 빨간색 직사각형을 #error 줄 앞에 놓습니다. OS를 정의한 줄 앞에 넣고 싶습니다. 예를 들어, 11 번 줄에 OS를 정의해야한다면, 11 번 줄로 보내 주시면 감사하겠습니다.이 방법이 있습니까?

+0

어떻게 11 행에 OS를 정의합니까? 단지 (예를 들면) #define WINDOWS? – vadikrobot

+0

@vadikrobot 내가 11 번 라인에서 OS를 정의한다면 내 프로그램의 11 번 라인은 예를 들어'#define WINDOWS'를 포함한다는 것을 의미합니다. –

+0

그리고이 줄이 없다면이 줄에 오류가 보이길 원하십니까? – vadikrobot

답변

3

, (당신은 당신이 원하는 일을 할 수있을 # 라인

1 #ifndef UNIX 
2 #ifndef MAC 
3 #line 11 
4 #error "OS must be WINDOWS, UNIX or MAC" 
5 #endif 
6 #endif 
7 #endif 
8  
9 int main() 
10 { 
11 // here will be error from line 4 
12 } 
2

전처리 기는 아주 간단합니다. 여기에있는 유일한 옵션은 오류 메시지의 줄 번호입니다. 그 숫자가 #define 인 경우 다른 번호 (이 경우 #define)도 처리되었으므로이 시나리오는 다른 정의 (사용자가 확인중인 OS)를 놓치기 때문에 어떻게 처리 되었습니까? 또한 세 가지 매크로를 같은 줄 번호에 모두 정의 할 수있는 방법은 없습니다. 단점이있는 매크로가 매우 취약한 시스템처럼 보이는 경우가 있습니다. 요점은 처음부터 결코 정의되지 않은 경우에 무엇이 정의되어야 하는지를 파악할 수 없다는 것입니다.

순수한 C++의 경우이를 처리하는 더 좋은 방법이 있습니다. constexprstatic_assert이 마음에 떠오 릅니다. Boost.Predef과 같은 표준 기능을 사용하면 수동으로 정의하는 것보다 더 좋은 아이디어처럼 보입니다. 당신은 당신의 코드에 어떤 정의 된 매크로가없는 경우 특정 라인에 오류를 표시하려는 경우

0

를 사용하는 것도 시도하지 그러나 당신이 당신의 논리를 바꾸면 보장 될 수 있습니다.

C 사전 처리기는 어떤 매크로가 OS 이름과 다른 이름을 사용하는지 알지 못합니다. 당신이 처리 할 수있는 세 가지가 아닌 다른 OS 이름을 생각하는 매크로를 잡을 방법은 없습니다. 가능한 많은 매크로 이름 대신 많은 가능한 값이있는 매크로 하나를 사용하십시오. 이제 당신이 처리 할 수없는 가치를 보았을 때, 당신은 뭔가를 할 수있을 것입니다. 매크로가 정의되어있는 경우

#define WINDOWS 1002437 // a random magic number 
#define UNIX 2753321 
... 

#define OS UNIX 

... 

#if OS == WINDOWS 
    ... 
#elseif OS == UNIX 
    ... 
#elseif ... 
    ... 
#else // here comes the trick 
    #define OS 99997321 
    #error "Bad OS" 
#endif 

많은 컴파일러는 재정에 대해 경고하고, 첫 번째 정의를 찾을 수 있습니다 정확히 말할 것이다. 그러나 이것은 보장되지 않습니다.

OS가 정의되지 않은 경우에도 이 아닌 곳을 정의 할 수있는 이론적 가능성조차 없습니다.이 정의되어 있습니다. 실제 소프트웨어에서

#line 11 
    #error "OS should be defined here" 

그러나 이러한 매크로는 일반적으로 컴파일러 명령 줄에 의해 정의되고, 제어되는 :이이 정의되어야한다 위치를 알고 있다면, 당신은 그 장소에 컴파일러를 직접 __LINE____FILE__ 지시어를 사용할 수 있습니다 귀하의 메이크 파일 또는 이와 동등한 것.

CPPFLAGS += "-DOS=$(OS_ID)" 

그래서 소스 코드에는 오류가 있다고 비난할만한 곳이 없습니다.