2017-10-04 17 views
0

가 어떻게이 예제 코드가 작동 할 수 있습니까? (C 또는 C++에서)어떻게 매크로 함수의 산술 표현식을 평가하여 C 전처리 기에서 다른 매크로 함수로 전달할 수 있습니까?

COUT은 본보기 내가 DEC_AND_PRINT(3)를 호출 할 때, 나는이 기대 올바른 감소 수

#define PRINT_1 std::cout<<"One : " <<1; 
#define PRINT_2 std::cout<<"Two : " <<2; 

#define DEC_AND_PRINT(number) PRINT_##number-1 

을 평가하려는 단지입니다 :

DEC_AND_PRINT(3) PRINT_##(3-1) -> PRINT_2 -> std::cout<<"Two : "<<2 

그러나 컴파일러주고 나에게 오류 :

GCC : error: 'PRINT_3' was not declared in this scope...

GCC : note: in expansion of macro 'DEC_AND_PRINT' DEC_AND_PRINT(3)

어떻게 인수를 감소시킬 수 있습니까?

기본적으로 매크로 함수가 숫자를 가져 와서 _name_of_macro_decremented_number 구문에서 다른 매크로 함수를 호출하려고합니다.

+1

PRINT_1 std :: cout << "One :"<< 1; "은 C에서 작동하지 않습니다. C 태그 삭제. – chux

+2

수 없습니다. 전 처리기는 이와 같이 사용할 수 없습니다. – EJP

+0

감사합니다 ..하지만 매크로에 어떤 식 으로든 arithimetic 표현을 평가하고 결과를 사용하여 매크로 이름 __ ## calculated value를 호출합니까? –

답변

0

모두에게 감사합니다.

내가 원하는 것을 할 방법이 없습니다. 전처리 기는 표현식을 평가할 수 없으므로 연결 결과 ##을 사용하십시오.

그래서 메신저 변화 코드는 재귀를 사용하고, 같이 손에 모든 조합을 쓰기 :

CALL의 DefinePointer (T)

DefinePointer_1 (T)

정의 T * -> 전화 DefinePointer_2 (T *)

   DefinePointer_2(T*) 
       Define T** -> Call DefinePointer_3(T**) 
            DefinePointer_3(T**) 
            Define T*** -> Call DefinePointer_4(T****)      

이것은 코드 조각 일 뿐이지 만 더 많은 내용이 있습니다. 필자는 많은 것을 작성해야했지만 결국에는 효과가 있었고 어떤 종류의 데이터에 대해서도 알고리즘과 데이터 구조를 작성할 수있었습니다.

+0

사실, _preprocessor_는 [표현식을 평가하고 그 결과를 연결로 사용할 수 있습니다] (http://coliru.stacked-crooked.com/a/cf4fa3f0c6e2493f). 표현식을 평가하는 _macro_를 만들 수 없습니다. –