2013-01-01 6 views
-3

저는 C++을 공부하기 시작했습니다. 그런 질문에 용서해주십시오. 내 작업은 원주를 계산하고 테스트하는 매크로를 작성하는 것입니다. 내가 여분의 괄호를 추가하지 않고 정확한 결과를 얻기에 C++ : 매크로가 이상하게 보입니다.

float l1 = LENGTH((1 + 2)); // Correct result. 

어떻게 이러한 매크로를 작성 할 수 있습니다

#define _USE_MATH_DEFINES 
#include <cmath> 

#define LENGTH(radius) (2 * M_PI * radius) 

float l1 = LENGTH(1 + 2); // The result should be 18.8495... I have 8.28. Incorrect result. 
float l2 = 1/LENGTH(2); // The result should be 0.07957... Working correctly. 

나는 parenthethis의 추가 쌍을 추가?

+0

당신이 할 수있는 최선의 방법은'constexpr' (또는 not) 함수를 작성하는 것입니다. – Griwes

+4

여기서 이상한 점은 매크로를 사용하는 것입니다. 인라인 함수가 더 적절할 것입니다. –

답변

12

사용 :

#define LENGTH(radius) (2 * M_PI * (radius)) 

당신이 당신의 정의 전처리와

float l1 = LENGTH(1 + 2); 

float l1 = 2 * M_PI * 1 + 2 
3

항상로 변환 쓸 때, 항상 ()에 매크로 인수를 감아 - 아무리 사소한 것처럼 보일 수도 있지만 조만간 필요할 것입니다.

물론 똑같은 기능을하는 것은 다음과 같은 이점이 있습니다. 1. 디버거에서 단계별로 수행 할 수 있으므로 실제로 진행되는 것을 파악할 수 있습니다. 2. 매크로 인수 표현에는 이상한 점이 없습니다.

지점 두를 설명하기 위해, 우리는 매크로 사용하여이 코드를 가지고 말 : 이제

// Print 10 lengths, 3, 5, 7, ... 
int x = 3; 
for(i = 0; i < 10; i++) 
{ 
     printf("Length of radius %d is %5.2f\n", x, LENGTH(x += 2)); 
} 

을, 누군가는 최적화 클래스를 갔고, 2 * 무언가가 무언가로 할 빨리는 것을 깨달았다 + 무언가를 다시 작성 그래서 매크로가 더 빠를 수 있습니다 :

#define LENGTH(radius) (((radius) + (radius)) * M_PI) 

이제, 우리가 x+=2이 있기 때문에 LENGTH 매크로, 이상한 물건이 같은 변수가 동일한 문 [그래, 난 두 가지를 사이에 평균 두 번 업데이트되기 때문에 (이 정의되지 않은 동작을하게 일어나는 시퀀스 포인트]. length 기능이 있다면 예상대로 완벽하게 작동합니다.

1

는이위한 매크로를 사용하지 마십시오 - inline function 모든면

에서 더 그러나 일어나는 것은 undertand에 꽤 간단하고 매크로를 피해야하는 이유를 알고 유용 이해. 분명히 잘못된 연산자 우선 순위를 가지고

float l1 = (2 * M_PI * 1 + 2); 

:

#define LENGTH(radius) (2 * M_PI * radius) 

float l1 = LENGTH(1 + 2); 

매크로는 위의 코드로 대체됩니다, 그래서 그냥 간단한 텍스트 교체, s입니다.

관련 문제