문제

더 높은 차수 기능을 시뮬레이션하기 위해 매크로 이름을 다른 매크로에 인수하는 것이 "안전"입니까?

즉, 발에 자신을 쏘지 않아야 할 곳은 어디입니까?

몇 가지 스 니펫이 있습니다.

#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)
도움이 되었습니까?

해결책

가능한 한 미리 처리기를 사용하고 있다면 시도해 볼 수 있습니다. 부스트 .proprocessor.

그러나 그것이 사실을 알고 있습니다 안전하지 않음 그렇게하려면. 예를 들어, 쉼표는 전처리기를 사용할 때 많은 문제가 발생합니다. 전처리자가 생성하는 코드를 이해하지 못하거나 이해하려고 시도한다는 것을 잊지 마십시오.

나의 기본적인 조언은 "하지 마십시오"또는 "가능한 한 조심스럽게하십시오"입니다.

다른 팁

C- 프로세서에서 전적으로 썩은 작은 장치 테스트 프레임 워크를 구현했습니다. 수십 개의 매크로, 많은 매크로는 다른 매크로 타입의 논쟁입니다.

이런 종류의 것입니다 ~ 아니다 "안전한"이 단어의 모범적 인 의미에서. 발에 자신을 쏘는 미묘하고 매우 강력한 방법이 있습니다. 단위 테스트 프로젝트는 손에서 나온 장난감입니다.

매크로 정의를 중첩 할 수 있는지 모르겠습니다. 의심 스럽지만 시도해 볼게 ... GCC는 그것을 좋아하지 않으며

Nested_macro.cc:8 : 오류 : 프로그램의 길 Stray '#'
Nested_macro.cc:3 : 오류 : 예상 생성자, 파괴자 또는 유형 변환 전에 '('토큰
Nested_macro.cc:3 : 오류 : '}'Token 이전의 예상 선언

셀프 플러그: 관심이 있으시면 단위 테스트 프레임 워크를 찾을 수 있습니다. https://sourceforge.net/projects/dut/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top