2012-11-03 6 views
1

정의 된 #if의 사용법이 올바른지 알아야하며,이 방법을 사용할 때의 가능한 단점을 알고 있어야합니다.함수 정의에 정의 된 #if의 사용

#if defined TEST 
int foo() 
{ 
    return 0; 
} 
int foo1() 
{ 
    return 0; 
} 
#else 
int foo() 
{ 
    return 1; 
} 
int foo1() 
{ 
    return 1; 
} 
#endif 

편집 : 내가 일하고 두 개의 서로 다른 플랫폼에이 코드를 사용하는 것을 시도하고있다 .

+0

무엇을 사용 하시겠습니까? 너는 무엇을 기대 하느냐? –

+5

이 구문은 유효하지만 정확성은 달성하려는 대상에 따라 다릅니다. – MByD

답변

5

구문 상 올바릅니다.

구성 방법의 주요 단점은 테스트 및 비 테스트의 경우에 대해 함수의 정의를 반복한다는 것입니다. 신중하게 최소화 된 예제에서 알 수없는 것은 문제의 정도입니다. 당신이 할 수있는, 이러한 정확한 함수의

int foo(void) 
{ 
#if defined TEST 
    return 0; 
#else 
    return 1; 
#endif /* TEST */ 
} 

int foo1(void) 
{ 
#if defined TEST 
    return 0; 
#else 
    return 1; 
#endif /* TEST */ 
} 

: 다른 방법은 될 현재의 반환 문 (적어도 두 경우 중 하나) 코드의보다 실질적인 블록 대리는 가정, 그것을 정리 :

#ifdef TEST 
#define RETVAL 0 
#else 
#define RETVAL 1 
#endif /* TEST */ 

int foo(void) 
{ 
    return RETVAL; 
} 
int foo1(void) 
{ 
    return RETVAL; 
} 

그러나 실제 기능은 매우 간단하지 않으므로 번역이 잘되지 않습니다.

일반적인 목표는 반복을 피하고 함수에서 나타나는 조건부 컴파일을 피하는 것입니다.

0

내가 생각할 수있는 유일한 문제는 중복성이며 심각한 프로젝트의 경우 심각한 문제입니다.

int foo() 
{ 
#if defined TEST 
    return 0; 
#else 
    return 1; 
#endif 
} 
int foo1() 
{ 
#if defined TEST 
    return 0; 
#else 
    return 1; 
#endif 
} 
+0

본인은 동의하지 않습니다. 다른 플랫폼에서 기능을 다르게 구현하는 것이 좋다고 생각합니다. 기능의 요점 인 - 추상 구현을 멀리하기 때문입니다. 그러나 함수 내부의 조건부 컴파일은 함수로 인도 할 것이고, 다른 플랫폼에서 다른 일을하고 지옥을 테스트 할 것입니다. – KAction

+0

예, 조건부 컴파일이 싫지만 어느 것이 더 낫습니까? 내 자신의 경험에서 코드 중복을 피하는 것은 우선 순위입니다. –

+0

제게 문법 (함수 선언)의 복제는 괜찮습니다. 논리 복제는 기능에 대한 프롬프트입니다. – KAction

0

당신은 다른 특정 플랫폼 라이브러리의 특정 플랫폼 코드를 넣어, 멀티 플랫폼 라이브러리를 만들 수 있습니다 : 당신은 가능한 한 작은 코드 중복을 유지해야이 적은 코드 중복이 작업을 수행하는 또 다른 방법입니다. 이렇게하면 다중 플랫폼 라이브러리가 #if 지시문을 사용하여 올바른 특정 라이브러리를 사용할 수 있습니다. 즉, 특정 플랫폼 코드를 분리합니다.

관련 문제