2009-05-06 3 views
3

고차 함수를 시뮬레이션하기 위해 다른 매크로의 인수로 매크로 이름을 지정하는 것이 안전합니까?(상위) 매크로로 어느 정도 할 수 있습니까?

e.e. 나는 발에서 자신을 쏘지 않기 위해 어디에서보아야합니까?

여기에 몇 조각은 다음과 같습니다

#define foreach_even(ii, instr) for(int ii = 0; ii < 100; ii += 2) { instr; } 
#define foreach_odd(ii, instr) for(int ii = 1; ii < 100; ii += 2) { instr; } 

#define sum(foreach_loop, accu) \ 
    foreach_loop(ii, {accu += ii}); 

int acc = 0; 
sum(foreach_even, acc); 
sum(foreach_odd, acc); 

일부 응용 프로그램에 대해, 나는 그것을 무엇을 할 수 있는가? :

#define foreach(ii, start, end, step, instr) \ 
    for(int ii = start; ii < end; ii += step) { instr; } 

#define foreach_even(ii, instr) foreach(ii, 0, 100, instr) 
#define foreach_odd(ii, instr) foreach(ii, 1, 100, instr) 

#define sum(foreach_loop, accu) \ 
    foreach_loop(ii, {accu += ii}); 

int acc = 0; 
sum(foreach_even, acc); 
sum(foreach_odd, acc); 

매크로 내에서 매크로를 정의 할 수 있습니까?

#define apply_first(new_macro, macro, arg) #define new_macro(x) macro(arg,x) 

답변

3

가능한 한 전처리기를 사용하는 경우 boost.preprocessor을 시도해보십시오.

하지만 은 안전하지 않으므로입니다. 예를 들어 쉼표는 전 처리기를 사용할 때 많은 문제를 일으 킵니다. 전처리 기가 생성하는 코드를 이해하지 못하거나 이해하려고 시도하지 않는다는 사실을 잊지 마십시오.

기본적으로 조언하는 것은 "하지 마세요"또는 "가능한 한 조심해서하십시오"입니다.

1

전 c-preprocessor에서 썩은 작은 단위 테스트 프레임 워크를 구현했습니다. 수십 개의 매크로, 많은 매크로가 다른 매크로 유형에 대한 인수입니다.

이 종류의 것은 이 아니며은 "안전한"단어의 모범 사례입니다. 발에서 자신을 쏠 수있는 미묘하고 매우 강력한 방법이 있습니다. 단위 테스트 프로젝트는 손에 닿지 않는 장난감입니다.

매크로 정의를 중첩 할 수 있는지 여부를 모릅니다. 나는 그것을 의심하지 않지만, 나는 GCC는 그것을 좋아하지 않는다 ... 시도 갈 것이고,

nested_macro.cc:8: error: stray '#' in program
nested_macro.cc:3: error: expected constructor, destructor, or type conversion before '(' token
nested_macro.cc:3: error: expected declaration before '}' token

자기 플러그 응답 : 당신이 관심이 있다면 단위 테스트 프레임 워크가 https://sourceforge.net/projects/dut/

에서 찾을 수 있습니다
관련 문제