범위

2012-03-31 6 views
0

아마 매크로 범위의 개념이 없다는 것을 알고 있지만, 나에게 다음과 같은 출력을 이해 도와주세요 - 매크로 기능에 로컬 것을 제안하는 것 같다범위

#include<stdio.h> 
#include<stdlib.h> 
#define A 100 
void fun(); 
int main() 
{ 

    fun(); 
    printf("%d\n",A); 
    system("pause"); 
    return 0; 
} 
void fun() 
{ 
    #undef A 

} 

내게는 컴파일러 오류가 있어야하지만 프로그램의 출력은 100입니다. 이유를 설명해주세요.

+1

함수에서 전 처리기 명령을 실행할 수 없습니다. 컴파일 된 코드에서 제거됩니다.그것이 전 처리기라고 불리는 이유입니다. 프로그램을 컴파일하기 전에 실행되고 제거됩니다. fun()에서 숫자 100을 정의하지 않습니다. – Zyerah

+0

@ user1131435 : 왜 대답으로 게시하지 않습니까? 나는 그것이 다른 답변 앞에 게시 된 방법을 볼 수 있습니다. 대답으로 게시하고 그것을 upvote 것입니다. –

+1

사실 @ user1131435 댓글이 올바르지 않습니다. 사전 처리기 지시문을 함수에 넣을 수 있으며 일반적인 방법으로 텍스트에 영향을 미치며 함수에서 "실행"하지 않습니다. – dmckee

답변

2

사전 프로세서는 소스 코드의 텍스트에서 작동하며 컴파일러가 적절한 이제까지을 실행하기 시작하기 전에 그것을 않습니다.

본질적으로 당신의 컴파일러는 당신이 기대 정확히

/* Lots of code from the included files omitted */ 
void fun(); 
int main() 
{ 

    fun(); 
    printf("%d\n",100); 
    system("pause"); 
    return 0; 
} 
void fun() 
{ 

} 

그래서 실행 (100)를 인쇄처럼 보이는 파일에서 작동합니다.

주의 모든 전처리 지시어는 사라, 그리고 defineundef 사이 A의 모든 인스턴스는 100로 대체 된 것을 그. 기억해야 할

건은 다음과 같습니다

  • 전처리 당신은 전처리 명령을 실행할 수 없습니다
+0

그래서 전처리 기가 논리적 순서로 프로그램을 트래버스하지 않고 위에서 아래로, 오른쪽으로? – ksb

+0

Er ... 전 처리기 *의 논리적 순서는 위에서 아래입니다. 전처리 기는 컴파일과 완전히 다른 단계입니다. 예, 컴파일러는 투명하게 실행되지만 별도의 프로그램 ('cpp')으로 구현되는 경우가 많습니다. 원한다면 (대부분의 사람들은'm4 '를 선호합니다) 원천이 아닌 텍스트 파일에서도 사용할 수 있습니다. – dmckee

+0

감사합니다. – ksb

0

매크로는 컴파일 타임 (사실 컴파일러 이전)에 실행됩니다.

1

전처리 기는 컴파일 타임에 프로그램 텍스트를 한 번 전달합니다. 프로그램이 실행될 때까지 모든 지시문은 오래 전에 사라졌습니다.

원래, 전처리 기는 사실 동일한 방식으로 토큰을 구문 분석 한 정도까지만 C를 이해하는 별도의 프로그램이었습니다. 프로그램의 매크로 확장 버전을 임시 파일로 만든 후 실제 컴파일러가 실행되었습니다. 오늘날 컴파일러에 통합되어 있지만 효과는 동일합니다.

이렇게 대문자로 된 매크로 이름을 사용하는 규칙이 시작된 것입니다. 즉, 매크로 이름의 본질적으로 다른 성격을 강조하기위한 것입니다. 컴파일러에서 확장되었지만 컴파일되지 않은 중간 텍스트를 출력 할 수 있습니다. 이것은 때때로 버그를 추적하고 복잡한 조건 컴파일을 이해할 때 유용합니다.

1

결과에

  • 그런 다음 컴파일러가 실행되는 텍스트를 변경, 실행 기능에. 컴파일 된 코드에서 제거됩니다. 그것이 전 처리기라고 불리는 이유입니다. 프로그램을 컴파일하기 전에 실행되고 제거됩니다. fun()에서 숫자 100을 정의하지 않습니다.

  • 0

    매크로 확장은 컴파일 전 단계 인 전처리 단계에서 수행됩니다. 이 단계 후에 어떻게 코드가 보이는지 알고 싶다면 전처리 전용 옵션으로 컴파일 해보십시오.

    gcc -E myfile.c > myfile.ppout 
    

    출력을 읽습니다.