2012-12-14 2 views
5

나는 일주일 동안 계속 놀았고 C에서 놓친 뭔가는 전 처리기 매크로이다.Go에서 C 스타일의 매크로

파이프가 clang -E을 통해 파일을 이동한다는 빌드 스크립트를 해킹하는 것 외에도이 기능을 사용하려면 어떻게해야합니까?

+2

나는 당신이 이동의 철학을 그리워한다고 생각합니다. 예를 들어 명확성의 중요성. –

+1

물론 명확성은 중요하지만 여러 번 반복하는 것이 동일한 코드가 명확성을 위해 더 좋다고 생각하지 않습니다. –

+5

달성하고자하는 것을 보여주는 예를 들면, 더 많은 "수행"방법이있을 것입니다. – Chris

답변

7

주석에서 언급했듯이 빌드 플래그가 필요한 모든 것을 해결하는 가장 좋은 방법 일 수 있습니다. 당신이 개발에서만 사용할 수 몇 가지 기능이 원한다면 예를 들어, dev 플래그를 사용 :

파일 constants_dev.go :

// +build dev 
const DEVELOPMENT = true 

파일 constants_pro.go에서 다음

// +build !dev 
const DEVELOPMENT = false 

당신의 코드, 그냥 간단하게 할 if DEVELOPMENT { blah... }. 어떤 전처리 기보다 훨씬 더 읽기 쉽다. 빌드 플래그가 많은 경우 상당히 복잡해질 수 있지만 그 시점에서 명령 줄 인수를 대신 사용해야합니다.

귀하의 의견에 귀하는 코드 중복에 대해 언급했습니다. 코드가 실제로 반복적 인 경우에는 어쨌든 함수에 넣거나 코드를 반복하여 재사용 할 수 있도록해야합니다. 개인적으로, 나는 단순한 부울 검사를 넘어서서 C 언어의 매크로를 사용하여 코드를 유지하기가 어렵다는 것을 발견했다.

제네릭과 동일한 내용입니다. 내가 사용했던 하나의 자바 라이브러리에서 클래스 서명은 다음과 같이이었다 : 라이브러리 아주 잘 설명하지 않은

class Thing<A, B, C, D, E> 

, 그래서 나는 코드의 상당한 양의 (모두 구현 및 코드를 읽을 수 있다고 라이브러리를 사용하여) 무슨 일이 벌어 졌는지 이해합니다.

Go에서는 언어가 일반적으로 더 나은 자체 문서화 코드로 이어지는 스타일을 강요합니다. Go 개발자는 전 처리기 및 제네릭과 같은 것을 생략하여 유지 보수하기가 쉽지만 영리한 코드를 작성하지 않도록해야한다고 생각합니다.

이전에 사용한 예전 관용구를 다시 살펴보기 전에 이동 방법을 시도해 보라고 조언합니다. 매크로와 #define이 사용 된 대부분이 무의미하다는 것을 알게 될 것입니다.

5

나는 cpp, m4 또는 Go가 전처리 된 당신의 욕망을 충족시킬 수 있다고 생각합니다. 그것이 좋은 생각인지 아닌지를 결정하는 것이지만, 사전 처리가 게시 된 Go 코드를 채택하는 데 큰 장애가된다는 경고를받습니다. (예를 들어 메이크 파일에 의존하는 빌드는 같은 이야기입니다.)