문제

매크로 확장 및 코드 생성 모두 장단점이 있습니다. 가장 좋아하는 접근 방식은 무엇이며 그 이유는 무엇입니까? 우리는 언제 다른 하나를 선택해야합니까? 친절하게 조언하십시오. 고맙습니다!

매크로 확장은 매우 편리하고 도움이 될 수 있습니다.http://dtemplatelib.sourceforge.net/table.htm

vs

코드 생성은 당신에게 좋은 코드를 많이 제공하지만 :http://code.google.com/p/protobuf/ http://incubator.apache.org/thrift/

도움이 되었습니까?

해결책

트레이드 오프입니다. 예를 들어 보겠습니다. 나는 기술을 우연히 발견했다 차동 실행 1985 년경, 나는 이것이 사용자 인터페이스를 프로그래밍하기에 정말 좋은 도구라고 생각합니다. 기본적으로 다음과 같은 간단한 구조 프로그램이 필요합니다.

void Foo(..args..){
  x = y;
  if (..some test..){
    Bar(arg1, ...)
  }
  while(..another test..){
    ...
  }
  ...
}

그리고 다음과 같은 제어 구조를 가지고 있습니다.

void deFoo(..args..){
  if (mode & 1){x = y;}
  {int svmode = mode; if (deIf(..some test..)){
    deBar(((mode & 1) arg1 : 0), ...)
  } mode = svmode;}
  {int svmode = mode; while(deIf(..another test..)){
    ...
  } mode = svmode;}
  ...
}

이제 정말 좋은 방법은 C 또는 기본 언어가 무엇이든 구문 분석기를 작성한 다음 구문 분석 트리를 걸어 원하는 코드를 생성하는 것이 었습니다. (내가 LISP에서했을 때 그 부분은 쉬웠습니다.)

그러나 누가 C, C ++ 또는 무엇이든에 대한 파서를 쓰고 싶어합니까?

대신, 나는 다음과 같은 코드를 쓸 수 있도록 매크로를 작성합니다.

void deFoo(..args..){
  PROTECT(x = y);
  IF(..some test..)
    deBar(PROTECT(arg1), ...)
  END
  WHILE(..another test..)
    ...
  END
  ...
}

그러나 C# 에서이 일을 할 때, 그들의 지혜의 누군가가 매크로가 나쁘다고 결정했고, C# 파서를 쓰고 싶지 않기 때문에 코드 생성을 손으로해야합니다. 이것은 왕의 고통이지만, 이러한 것들을 코딩하는 일반적인 방법과 비교할 때 여전히 가치가 있습니다.

다른 팁

C ++의 경우 나는 매크로보다 템플릿 Metaprogramming 또는 코드 생성을 선호하지만 매크로에는 여전히 사용이 있습니다.

dbtemplatelib로 제공 한 예는 C ++ 0x로 덮을 수 있습니다. 변수 템플릿, 유형 확인 등과 같은 추가 혜택이 있습니다.

C 또는 C ++에서, 거시적 확장은 디버그하기가 어렵다. 반면에, 코드 생성기를 작성하는 것은 별도의 프로그램이기 때문에 디버깅하기가 더 쉽습니다.

그러나 이것은 단지 C 프리 프로세서의 한계 일 뿐이라는 것을 알고 있어야합니다. 예를 들어 LISP 언어 제품군에서 거시적 확장 ~이다 코드 생성, 정확히 같은 것입니다. 매크로를 작성하려면 S- 표현 입력을 다른 S- 표현으로 변환하는 프로그램 (LISP)을 작성한 다음 컴파일러로 전달됩니다.

둘 다 문제가 있습니다. 매크로와 달리 코드 생성은 읽을 수 있고 디버깅 할 수있는 (단어 일입니까?) 코드를 생성 할 수 있지만 덜 유연하고 변경하기가 어렵습니다.

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