2013-07-26 2 views
0

누구든지이 코드가 무엇을하고 있는지 말할 수 있습니까?코드 조각을 디코드 할 수 없으며 목적이

#ifdef TF_UNIT_TEST 
/*lint --emacro((652), TF_STUB) */ 

#define TF_STUB(fn) __tf_ ## fn 

#else 

#define TF_STUB(fn) fn 
#endif 
+1

'##'CONCATENATE의 전처리 출력을보기 위해 다음과 사용

#define TF_UNIT_TEST #ifdef TF_UNIT_TEST #define TF_STUB(fn) __tf_ ## fn #else #define TF_STUB(fn) fn #endif int main() { TF_STUB(stackoverflow); } 

같은 프로그램에서

#ifdef TF_UNIT_TEST //If this macro is defined then define follows #define TF_STUB(fn) __tf_ ## fn //it defining this macro as _tf_fn (concatinating what ever parameter it has in IF_STUB(fn)) #else #define TF_STUB(fn) fn //Else it defined as fn #endif 

보이는 매크로 정의 전 처리기에 의한 두 개의 문자열 토큰. [질문] (http://stackoverflow.com/questions/5256313/cc-macro-string-concatenation) –

+0

토큰 붙여 넣기 연산자'##': http://msdn.microsoft.com/en-us/library/09dwwt6y (v = vs80) .aspx – P0W

답변

4

그것은 두 개의 다른 이름이 TF_UNIT_TEST 매크로가 정의 여부에 따라와 함수를 정의합니다. 주요 코드 본문에

기능은 매크로 가, 다음 함수가 __tf_my_function로 지정됩니다 정의 경우 예를 들어

int TF_STUB(my_function) (int a, int b) 
{ 
} 

로 선언 될 것입니다, 그리고 다음 경우는 단지 my_function 지정됩니다.

2

다른 사람들은 기술적 인 행동을 취하고 있습니다 ...하지만 귀하의 질문에 나는 암묵적인 "왜?"를 봅니다.

이것은 단위 테스트를 돕는 데 사용되는 트릭입니다. 이는 생산이 개발자가 수행 한 단위 테스트에서 복제하기가 매우 어렵거나 원하지 않는 부작용이있는 기능을 호출하는 환경에서 발생합니다. 따라서 개발자는 대체 "안전한"기능을 제공합니다.

또 다른 이유는 단위 테스트 함수가 "실제"루틴을 호출하기 전에 추가 조치를 취해야하기 때문입니다. 데이터를 추가로 로깅하거나 테스트하면 단위 테스트가 더 쉬워집니다. 로컬 화면에서 복잡한 작업을하는 그래픽 프로그램을 작성하는 경우 실제 비디오를 디코딩하는 것보다 텍스트 파일에 색상 등을 기록하는 것이 훨씬 쉬울 수 있습니다.

1

그 컴파일 당신을 programm

gcc -E pre1.c 

output 
1 "pre1.c" 
1 "<built-in>" 
1 "<command-line>" 
1 "pre1.c" 
11 "pre1.c" 
int main() 
{ 
__tf_stackoverflow; //its appended 
}