2012-03-23 3 views
1

이 매크로는 tweejump 게임의 소스 코드를 파고있는 동안 발견했습니다.매크로 선언

#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__) 

제게는 CGPointMake의 별명입니다. 왜 이것이 필요합니까?

답변

3
  1. cpp를 입력 덜보다 3 개 문자를 작성하는 훨씬 더 쉽게, 예 통화

#ifndef DEBUG 주위에 약간의 디버깅을 포장하는

  • 누군가가 매핑을 변경할 수 있습니다
    #define ccp(__X__,__Y__) CGPointMake(__X__,__Y__)
    #else
    #define ccp(__X__,__Y__) myassert2(((__X__) > 0),((__Y__) > 0), \
    CGPointMake(__X__,__Y__))
    #endif

    우리는 왜 그렇게할까요?

    #define ccp(__X__,__Y__) CGPointMake((__X__),(__Y__)) 
    

    하지만로를 : 항상 괄호 안에 인수를 마무리하는 매크로에 대한 안전 일반적으로, BTW

    #define myassert2(xc1, c2, fun) ((c1) && (c2)? fun((c1),(c2)): \ 
         fprintf(stderr, "Error in file %s, line %d, c1=%d c2=%d\", \ 
             __FILE__, __LINE__, (c1), (c2)) 
    

    : 우리는 버그가 소스 코드의 라인에 대한 오류를 얻을 수 있습니다 jamesdlin은 함수 호출의 경우에는 중요하지 않다고 지적했습니다.

    IMHO 더 복잡한 규칙을 사용하는 대신 안전하고 설명하기 쉽고 기억하기 쉬운 '규칙'을 가지고 더 강력한 이유 때문에 멀리하는 것이 좋습니다. 결국, 매크로의 인자를 괄호로 묶을지를 결정하는 것보다 더 흥미로운 문제가있다. (내 코드)

    (나는 최근의 BBC 호라이즌 프로그램으로 인해 특히 간단한 규칙에 유의한다. 인간이 하지이 성공적으로 한 번에 약 3 가지를 생각할 수 있다는 증거! - (

    (HELP는 #if ... 같은 C 프리 프로세서의 소스 코드를 포맷 할 수있는 쉬운 방법입니다 무엇은 {} 작동하지 않았다 가 다시 didn를 틱 '!? 4 개의 선행 공백이 작동하지 않음. 모두 # 문자 일부를 사용함)

  • +0

    매크로 인수가 함수에 인수로 전달 될 때 여분의 괄호가 중요한 상황은 무엇입니까? – jamesdlin

    +0

    좋아, 내 자신의 질문에 대답하기 위해, 나는 그들이 중요하지 않으며 그것이 그대로 안전하다고 주장한다. https://www.securecoding.cert.org/confluence/display/seccode/PRE01-C.+Use+parentheses+within+macros+around+parameter+names#PRE01-C. 매크로를 매개 변수로 사용하여 괄호를 닫을 수 있습니다 .- 예외는 동의하는 것으로 보입니다. – jamesdlin

    +0

    함수 호출에서 중요한 것은 C++뿐입니다. ','연산은 두 개의 매개 변수 호출을 세 개의 매개 변수 호출로 변경할 수 있습니다.이 호출은 대체 서명과 일치 할 수 있습니다. 하지만 요점은 괄호 안의 매크로 매개 변수가 버그를 발견하기가 매우 어렵다는 것입니다. 그래서 항상 IMHO를 추가하는 것이 더 간단합니다. 내 Q & D 디버그 코드, 오타 또는 다른 우선 순위 연산자 (&&보다 낮음)에서 알 수 있듯이 버그가 발생할 수 있습니다.사람들은 종종 기존 코드를 모델로 사용하여 패턴을 반복하고 작은 조각을 추가하므로 안전을 위해 시작하는 IMHO는 미래에 도움이됩니다. 괜찮아? – gbulmer

    3

    별칭은 CGPointMake입니다. 9

    +0

    지연 코드 : :) – OhDoh

    +0

    그리고 읽는 것이 훨씬 더 어렵습니다 ... –