2009-06-10 2 views
1

여러 환경을 지원해야하는 프로젝트 C이 주어지면 전처리기를 사용하여 정확히 하나의 환경이 정의되도록 어떻게 적용합니까? 이미 수정확히 하나의 정의를 적용하는 방법은 무엇입니까?

는 수행

 
    #if defined PROJA 
    (blah blah blah) 
    #elif defined PROJB 
    (etc) 
    #else 
    #error "No project defined" 
    #endif 

않는 모든하지만, 0 프로젝트가 정의 된 경우 말해입니다. 도움이되는 영혼이 프로젝트 A와 프로젝트 B를 모두 정의하면 전처리 기는 프로젝트 A 만 가정합니다. 그러나 저의 관점에서 올바른 행동은 오류를 표시하는 것입니다.

2 개의 프로젝트 만 정의되어있어이 문제는 간단합니다. 200으로 어떻게 해결할 수 있습니까?

+3

(200)와 전 처리기 해킹 후 오히려 makesystem이 –

답변

2

아마 다른 파일

include_proja.h 
include_projc.h 

이 다음 Makefile을 사용하거나 바로 파일을 포함하도록 뭐든간에. 그런 다음 코드로 200 개의 개별 파일을 생성하고 컴파일 타임에 올바른 파일을 포함 할 수 있습니다.

의 종류는의 빌드 시스템입니다. 매크로로 이상한 일을하고 있다면 ... 소스 코드 밖에서 더 좋은 방법을 찾으십시오.

각 파일은 어떻게 (여기에 상세 실례)

#define A_PROJECT_INCLUDE_WAS_INCLUDED 

을 그리고

#ifndef A_PROJECT_INCLUDE_WAS_INCLUDED 
    #error "No project include" 
#endif 

을 그러나 일부 누락 된 기호는 십중팔구 어쨌든 그것을 깰 것입니다 수 있습니다. 이 같은

행운

+1

알아서해야 할 것, 유지 완전한 고통이 될 것 "일이 이런 종류의 시스템을위한 구축 할 것입니다. 당신이 이상한 일을하는 경우 이렇게 매크로를 사용하면 소스 코드 외부에서 더 나은 방법을 찾을 수 있습니다. " 당신은 완전히 옳습니다. – JXG

3

뭔가 : 중첩 된 IFS와

#if defined PROJA 
    #ifdef HAVE_PROJ 
    #error 
    #endif 

    #define HAVE_PROJ 
#endif 

#if defined PROJB 
    #ifdef HAVE_PROJ 
    #error 
    #endif 

    #define HAVE_PROJ 
#endif 

#ifndef HAVE_PROJ 
    #error No project selected (you need to define PROJA, PROJB, or ...) 
#endif 
+0

나는 이것이 빠르게 냉혹해질 것이고, 매크로에서해야 할 일이 아니라고 생각한다. –

0

문제는 당신이 N과 n 개의 프로젝트^2 개 개의 다른 테스트를 끝낼 것이라는 점이다.

이 경우 컴파일 타임 오류가 발생하는식이 필요합니다. 아마도 :

등 B, C,이어서

용 등

#ifdef PROJA 
#define PROJA-TEST " 
#else 
#define PROJA-TEST "" 
#endif 

하고 :

const char *test_only_one_project = PROJA-TEST PROJB-TEST PROJC-TEST " "More than one project is defined!"; 

EDIT ... 코스 만이 시험 프로젝트 홀수 정의되었는지 .하지만이 작동합니다 :

#ifdef PROJA 
#define PROJA-TEST (
#endif 

등, 다음

const char *test_only_one_project = PROJA-TEST PROJB-TEST PROJC-TEST "More than one project is defined!"); 
+1

첫 번째 생각은 "그래, 그렇게하는거야." 제 두 번째는 "그래서 아무도 C를 더 이상 좋아하지 않는 이유가 무엇입니까?" –

+0

정확히. 전처리 기가 꽤 사악합니다. –

-1

을 같은 아마 당신이 할 수 있습니다 :

#if PROJ==A 
(blah blah blah) 
#elif PROJ==B 
(etc) 
#else 
#error "No project defined" 
#endif 
2

지금이

#define ENV_UNKNOWN 0 
#define ENV_MACOSX 1 
#define ENV_LINUX 2 
#define ENV_WIN32 3 
/* and so on */ 


#ifndef ENVIRONMENT 
/* no environment given, default to something (perhaps) */ 
#define ENVIRONMENT ENV_UNKNOWN 
#endif 

/* and now the environment specific parts */ 
#if (ENVIRONMENT == ENV_MACOSX) 
#include "macosx_port.h" 
#endif 

#if (ENVIRONMENT == ENV_LINUX) 
#include "linux_port.h" 
#endif 

#if (ENVIRONMENT == ENV_WIN32) 
#include "win32_port.h" 
#endif 

#if (ENVIRONMENT == ENV_UNKNOWN) 
#error You have to specify the ENVIRONMENT. 
#endif 

을 수행 할 수 있습니다 시도 명령 행에서 컴파일하고자하는 환경을 지정하십시오. 다음과 같이하십시오 :

다른 방법은 컴파일하는 환경에 따라 빌드 시스템에서 다른 모듈을 포함하거나 링크하는 것입니다.

2
#if defined PROJA 
bool one_project_defined = true; 
#endif 

#if defined PROJB 
bool one_project_defined = true; 
#endif 

#if defined PROJC 
bool one_project_defined = true; 
#endif 

#if defined PROJD 
bool one_project_defined = true; 
#endif 

one_project_defined; // Won't compile in wrong builds 
+1

이것은 짧고 간단합니다. 그것은 일종의 해커라고 생각합니다. – Brian

+0

유지 보수 작업을 돕는 협동 조합이 나오기 전까지는 "이 변수가 더 이상 사용되지 않고 있습니다 ..." – David

관련 문제