2013-01-08 6 views
1

Windoes 및 Linux에서 C++ 코드 한 부를 컴파일하고 실행하고 싶습니다. 그래서 조건부 컴파일 (CC)을 사용해야합니다. 그러나 많은 수의 코드 파일에서 CC를 사용하는 방법은 입니다..코드 파일 수가 많은 C++ 조건부 컴파일

//A.cpp 
#define _WINDOWS_ 
#ifdef _WINDOWS_ 
#include <windows.h> 
//some code for windows 
#else 
#include <pthread.h> 
//some code for linux 
#endif 

와 나는 또한 B.cpp, C.cpp이 ...

내가 모든 하나의 파일에 "#DEFINE의 _WINDOWS_"를 작성해야, 또는 :

같은, 내가 가지고 그것은 더 좋은 방법이 있습니까?

그리고 난 이렇게 할 시도 :

//A.cpp 
#include "Platform.h" 
#ifdef _WINDOWS_ 
#include <windows.h> 
//some code for windows 
#else 
#include <pthread.h> 
//some code for linux 
#endif 

3 : 1. 머리 파일 Platform.h

#ifndef _PLAT_ 
#define _PLAT_ 
#define _WINDOWS_ 
#endif 

2를 만들처럼, 파일 Platform.h을 포함 그것은 오류를 컴파일! 아마도 "Platform.h"를 포함하기 전에 오류가 발생했을 수 있습니다.

감사합니다.

+3

자신 만의 롤링보다'_WIN32'를 사용하는 것이 더 좋습니다. – chris

+0

다른 플랫폼에 코드를 분리하기 위해 추상적 인 공장이 필요하다고 느끼십니까? http://en.wikipedia.org/wiki/Abstract_factory_pattern – billz

+0

컴파일 오류가 무엇입니까? 적어도 –

답변

2

컴파일러에서 미리 정의 된 매크로를 사용하십시오.

http://sourceforge.net/p/predef/wiki/OperatingSystems/

#ifdef _WIN32 
// Code specific to Windows. 
#elif defined __linux__ // Many variants; check the link above. 
// Code specific to Linux. 
#else 
// Portable code. 
#endif 

이것은 대부분의 경우에 작동합니다. 이 매크로의 대부분이 호스트 운영 체제 (즉,있는 프로그램을 구축하고있는 시스템)이 아닌 대상 운영 체제 (결과하는 시스템을 검색하는 데 사용되는

주 프로그램이 실행되도록 의도 된 경우). 그러나 일반적으로 두 시스템이 일치하는 경우입니다. 또한 이들 매크로 중 실제로 미리 정의 된 매크로가 특정 컴파일러에 따라 분명히 달라질 수 있습니다.

다른 모든 것이 실패한 경우 (예 : 대상 시스템이 호스트와 다르거 나 컴파일러가 시스템 탐지 매크로를 미리 정의하지 못할 정도로 이상한 경우) 컴파일러의 명령 줄에서 이들 중 하나만 정의하면됩니다 (예 : POSIX 호환 C 컴파일러에서 -D 사용)을 빌드 스크립트 나 makefile에 넣음으로써 가능합니다. 그러한 #define을 헤더 자체에 쓰지 마십시오.

+0

+1하지만 일반적으로 다른 플랫폼 용으로 컴파일하려면 적절한 플랫폼 플래그를 정의하는 교차 컴파일러가 필요합니다. 수동으로 일을 조정하여 다른 플랫폼의 코드를 얻으려고하면이기는 것이 불가능할 수도 있습니다. – Potatoswatter

0

컴파일 중에 -D_WINDOWS_를 사용할 수 있습니다. (3) 헤더는 주문에 민감합니다.

+0

-1, 이것은 얽힌 빌드 시스템과 사용자를 혼동시키는 확실한 방법입니다. – Potatoswatter

+0

네, 일반적으로 여러 요소에 따라 달라집니다. 나는 극도로 거대한 코드베이스를 가진 회사에서 일하고 있으며 이것은 지금 10 년 동안 유행 해왔다. 다시 이것은 엔지니어링 문제이며이 접근법이 좋을 때 여러 인스턴스가 있습니다. 전체 유스 케이스가 명확해질 때까지는이 접근법에 대해 담요를 발행하지 않습니다. – user1952500