2016-10-16 2 views
1

간의 조합 I는 다음의 함수 (bool 단지 #define bool int 매크로이다) 가지고매크로 - 함수와 승산

bool v2dAngleRad(Vector2D* v2d1, Vector2D* v2d2, double* angle); 

그것은 두 차원 벡터 (결과 angle에 저장된다) 사이의 각도를 반환한다. 반환 값 "boolean"을 사용하여 작업이 성공했는지 확인하는 데 사용됩니다.이 경우에는 true (내 경우 #define true 1;) 인 경우에만 전달 된 인수가 확인됩니다. 있다. 나는 어떤 일이 실패 할 가능성 때문에 그 일을 더 많이 또는 덜하게 만들었고, 예외적 인 경우가 없기 때문에 C에이 상황을 해결하는 가장 좋은 방법 인 것으로 알고있다. v2dAngleRad(...)에서 잘못 될 수있는 유일한 것은 v2d1 및/또는 v2d2에 대한 잘못된 참조가 전달 된 경우이며, 어떤 경우에는 false을 반환하려고합니다.

그 외에도 매크로를 사용하여 메모리를 새로 고치고 나중에 다른 기능을 사용하여 도수 변환을 처리하고 싶었습니다. 나는 다음과 같은 매크로를 정의하려면 :

#define v2dAngleDeg(v2d1, v2d2, angle) ... // angle*180./M_PI 

문제는이다 인해 제 기능을 나는 방법을 찾아 드릴 수 없습니다 (반환 값과 포인터로 전달 된 인수) 정의되는 방식 매크로 정의에서 angle을 사용하여 함수 호출에 의해 채워진 후이를 도수로 변환하는 방법. 부울 반환 값에 대한 추가 검사가 수행되어야하며 작업이 성공적으로 수행 된 경우에만 변환이 수행되어야합니다.

내 기능은 내가이 꽤 바보 보일 수 있습니다 알고

#define v2dAngleDeg(v2d1, v2d2) (v2dAngleRad(v2d1, v2d2)*(180.0/M_PI)) 

을 할 수 있었을 것이다 나는 실제로 아마거야 각도를 반환이

double v2dAngleRad(Vector2D* v2d1, Vector2D* v2d2); 

같았다 경우 이 기능을 처리하기 위해 별도의 함수를 작성하는 방법을 알고 싶습니다. 일반적으로 (각도 나 토마토를 처리해도 상관 없습니다).

+0

매크로를 사용하는 이유가 전혀 없습니다. 함수가 할 수 있으면 매크로를 사용하지 마십시오.컴파일러를 신뢰하지 않는다면, 함수를'inline'으로 만드십시오. – Olaf

+0

아, 고마워! 나는 그들이 표준 라이브러리에 이런 것을 포함 시켰는지조차 몰랐다. – rbaleksandar

+0

그럴 경우 먼저 현대 C 책을 읽고 싶을 것입니다. '_Bool' resp. 'bool' 매크로는 17 년 이래로 표준입니다. 다른 무엇을 놓쳤는 지 생각해보십시오. '인라인'함수. – Olaf

답변

0

함수의 구현이 단순하면 함수를 v2dAngleDeg을 참조하지 않고 만드는 것이 더 쉽습니다.

static inline bool v2dAngleRad(Vector2D* v2d1, Vector2D* v2d2, double* angle) 
{ 
    if (! v2dAngleDeg(v2d1, v2d2, angle)) 
     return false; 

    *angle *= 180/M_PI; 
    return true; 
} 

대신 여러 줄 처리기 매크로를 사용할 수있을 것이다, 그러나이 덜 견고 : 당신은 위임 할 경우, 당신은 인라인 함수를 사용할 수 있습니다. See this thread 두 가지 방법을 비교해보십시오.

C99 inline은 언어의 일부이기 때문에 C89 컴파일러에서도 대부분이 inline과 동일한 키워드 또는 특성을 지원합니다. 물론 인라인 함수로 만들 필요는 없습니다. 헤더에 비 - 인라인 선언을 넣고이 정의를 어딘가에 소스 파일에 넣을 수 있습니다.

NB. 자신의 bool을 굴리기보다는 standard#include <stdbool.h>을 사용하는 것이 좋습니다. bool을 해킹하기 위해 int을 사용하면 미묘한 버그가 발생할 수 있습니다.