2011-12-09 2 views
4

기본적인 질문은매크로 확장

그래서 여기에 매크로가 확장되는 방법을
#define A 5 
#define B 10 

#define C (A*B) 


int var; 
var = C; 

, 그것은

var = (5*10) 

또는

var = (50) 

내 의심의 여지가 매크로 확장에입니다. 매크로가 모든 상수에 대해 몇 가지 계산 (*, -, /, +)을 가지고 있다면 마르코는 단지 라인 확장 일 뿐이며 결과를 평가하고 게시합니다

답변

2

매크로는 단지 사전 컴파일러 그냥 정의 된 값으로 매크로를 대체합니다. 따라서 매크로가 정의에 의해 대체되면 컴파일러는 해당 연산을 평가합니다. 추가 컴파일러는 (5*10) 컴파일러와 같은 표현식을 최적화하는 방법으로 As-If 최적화 규칙을 따르며 여기서 (5*10)50으로 직접 바꿀 수 있습니다. 이는 프로그램의 관찰 가능한 동작을 변경하지 않기 때문입니다.

3

매크로 확장은 항상 입력 소스 코드의 텍스트 변형입니다. 전 처리기 (매크로 확장을 수행하는 컴파일 부분)가 완료된 후에 코드를 볼 수 있어야합니다. 이 텍스트는 컴파일러가 올바르게 작동하는 것입니다.

그러나 많은 컴파일러가 컴파일 중에 "constant folding"최적화를 수행하므로 실행시 계산할 필요가 없도록 5 * 10에서 50으로 최적화됩니다.

0

매크로 모든 현대 컴파일러 프리 컴파일러

컴파일러는 거의 틀림이 등가 VAR로 최적화 그러나

= 50 = VAR (* 105)로 확장된다.

매크로 확장을 볼 수 있도록 미리 컴파일 된 코드를 출력하도록 컴파일러를 설정할 수 있어야합니다.

2

전처리 기의 출력은 (5*10)입니다. 계산을 수행하는 것은 컴파일러의 책임입니다.이 경우 표현식을 일정하게 변경하십시오.

1

전 처리기에 따라 다를 수 있습니다. 컴파일러가 최적화를 수행하기 때문에 전처리 기는 대체 작업 만 수행 할 수 있습니다.

내 GCC 버전 i686-apple-darwin10-gcc-4.2.1

같은

gcc -E test.c 
+0

pl -E 힌트를 위해 우리 1. 그냥 언급하고 싶었어 ... – fex

0

이 될 것 확인하는 당신이 -E 플래그 옵션을 사용할 수 있습니다 1

var = (5*10) 

옵션으로 보여주고있다 (5 * 10) 후 매크로가 확장되지만 그 후에 컴파일러는이를 50으로 최적화합니다.