2010-07-31 2 views
0

폴 그레이엄 writes는 :매크로 : 이점은 무엇입니까?

예를 들어, 유형, 정적 입력이 내 의견으로는 어떤없이, 진정한 macros-- 을 배제 보인다는 사실에도 불구하고, 논문 연구의 무진장 원천이 될 것 같다 no 언어를 사용할 가치가 있습니다.

매크로가 큰 차이점은 무엇입니까? 나는 그들과 함께 많은 시간을 보냈지 만, 레거시 C/C++에서 나는 템플릿/제네릭이 존재하기 전에 해킹으로 사용되는 것처럼 보인다.

그것은

DECLARELIST(StrList, string); 
StrList slist; 

List<String> slist; 

에 어떻게 든 바람직하다 내가 뭔가를 놓치고 있습니까 상상하기 어렵다?

그런 의사 함수로 사용이 MAKEPOINTS 같은있다 :

POINTS MAKEPOINTS(
    DWORD dwValue 
); 

왜 대신 함수로 정의? 다른 스택 프레임의 추가 된 오버 헤드없이 코드 중복을 피할 수있는 최적화입니까?

그런 다음 GOTO와 관련된 까다로운 제어 흐름이 있습니다. 이는 고의적 인 가치가있는 것 같습니다.

매크로의 장점은 무엇입니까? 그것들은 타입 안전성이 떨어집니다 (C와 C++에서) (맞습니까?). 폴 그레이엄이없는 이유는 무엇입니까?

+6

폴 그레이엄 (Paul Graham)이 말하는 매크로 종류는 실제로 C 및 C++과 같은 종류의 매크로는 아니지만 Lisp 매크로와 비슷합니다. 문제에 대한 어떤 권위와도 이야기 할 수 없으므로 답변이 아니라 의견을 말합니다. –

답변

0

매크로는 C/C++에서 실제로 두 가지에만 적합하며 일반적으로 매크로를 사용하지 않고 수행 할 수있는 경우 최후의 수단으로 사용해야합니다.

  1. 언어에 존재하지 않는 새로운 구문 구조 또는 추상화 만들기.
  2. 특히 서로 동기화되어야하는 것 사이에서 중복을 제거하십시오.

거의 매크로를 함수로 사용하지 않습니다.

또한 LISP 매크로가 이 아니라 C/C++ 매크로라는 것을 알아야합니다.

+0

그래, Paul Graham이 Lisp 매크로에 대해 이야기하고 있다고 가정하는 것이 안전하다고 생각합니다. 주요 차이점은 무엇입니까? –

6

LISP 매크로는 완전히 다른 짐승입니다. C/C++ 매크로는 극히 기본적인 언어를 사용하여 텍스트 부분을 텍스트 부분으로 대체 할 수 있습니다. LISP 프로그램은 ("읽기"후에) LISP 데이터 구조이므로 전체 언어를 사용하여 조작 할 수 있습니다.

이러한 매크로를 사용하면 매크로를 사용하여 언어를 광범위하게 확장 할 수 있으며 모든 사람이 비교적 쉽게 사용할 수 있습니다. 예를 들어 Common Lisp Object System을 예로 들어 보겠습니다. 핵심에는 언어가 객체와 같이 원격으로 존재하지 않습니다. 매크로를 사용하는 비교적 간단한 구문을 포함하여 언어 자체로 완전히 구현됩니다.

물론 언어에 내장되어 있기를 바라는 대부분의 것들이있는 경우 매크로가 덜 필요합니다. OTOH, LISP 팬들은 충분히 강력한 메타 프로그래밍 능력 (매크로)을 갖춘 충분히 간단한 언어 (LISP)가 새로운 개념이 스펙이나 작업 구현을 변경하지 않고도 언어에 통합 될 수 있기 때문에 더 낫다는 견해를 가지고 있습니다. 그러나 매크로 사용에 대한 가장 강력한 예는 DSL 영역입니다. Ruby on Rails와 다른 사람들은 매일 얼마나 유용한 DSL이 될 수 있는지 보여줍니다. 예, Ruby에는 매크로가 없으며 Ruby 구문을 어느 정도 구부릴 수 있습니다. 다른 언어 나 Ruby의 구문이 충분히 유연하지 않은 경우에는 복잡한 DSL을 구현하기 위해 매크로 또는 완전한 구문 분석기/인터프리터가 필요합니다.

관련 문제