2016-07-06 5 views
0

#define의 범위는 무엇입니까?#define의 범위는 무엇입니까?

저는 C/C++ 용 #define의 범위에 관한 질문을 가지고 있으며 전 처리기를 이해하려고 노력하고 있습니다.

여러 소스 및 헤더 파일을 포함하는 프로젝트가 있다고 가정 해 보겠습니다. 이제 나는 다음이 헤더 파일이 있다고 가정 해 봅시다 :

// header_file.h 

#ifndef __HEADER_FILE 
#define __HEADER_FILE 

#define CONSTANT_1   1 
#define CONSTANT_2   2 

#endif 

하자 그때 두 개의 소스 다음과 같은 순서로 컴파일 된 파일이 있다고 가정 : 내가 포함 한 가정

// source1.c 

#include header_file.h 

void funct1(void) 
{ 
    int var = CONSTANT_1; 
} 


// source2.c  

#include header_file.h 

void funct2(void) 
{ 
    int var = CONSTANT_2; 
} 

를 필요한 모든 다른 오버 헤드,이 코드는 잘 컴파일해야합니다. 그러나 컴파일 사이에 #define이 기억되는지 궁금합니다. 위의 코드를 컴파일 할 때 각 #include의 내용이 실제로 포함 되었습니까? 아니면 포함 된 가드가 실제로 구현 되었습니까?

TLDR : #define은 하나의 컴파일 단위에서 다음 컴파일 단위까지 이어질 수 있습니까? 아니면 #define은 하나의 컴파일 유닛에만 존재합니까?

내가 입력 할 때, 나는 내 자신의 질문에 대답하고 있다고 믿고, 나는 믿어지는 대답을 말할 것이다. #define은 단일 컴파일 단위 (.c)로 제한됩니다. 전처리 기는 하나의 컴파일 단위에서 다음 컴파일 단위로 넘어갈 때 기본적으로 모든 #define을 잊어 버립니다. 따라서 위에 열거 한 예에서는 포함 된 경비원이 출현하지 않습니다. 이 신념에서 나는 맞습니까?

+6

TL/DR :'#define '은 각 컴파일 단위에서 아래쪽으로 정의 된 지점에서'# undef'-ed까지 볼 수 있습니다. –

+0

[C에서 # 선처리 프로세서의 범위] (http://stackoverflow.com/questions/6379489/scope-of-define-preprocessor-in-c)의 가능한 복제본 –

답변

2

source1.c는 source2.c와 별도로 컴파일되므로 정의는 source1이 컴파일 될 때 처리되고 독립된 조치로 컴파일 될 때 source2에 대해 처리됩니다.

희망적인 것은 명확한 설명입니다.

0

네, 맞습니다! 파일 자체 컴파일은 단지 실행중인 프로세스 일뿐입니다. 하나의 프로세스는 명시 적으로 수행되지 않는 한 다른 프로세스와 상호 작용할 수 없습니다. c 전처리 기는 단지 리터럴 대체 메커니즘이며, 어리석은 방식으로 수행됩니다. 어떤 조건부 검사가 수행 되든간에 사전 처리기의 진행중인 인스턴스에만 국한되며, 실행 (편집)이 끝나면 아무 것도 수행되지 않습니다. 전처리 기는 컴파일러를 "구성"하지 않으며 해당 범위는 "자체 컴파일"까지 제한됩니다.

1

전 처리기 매크로는 "범위"가 없으므로 코드의 매크로를 대체해야하는 텍스트를 정의합니다 .

이 컴파일러는 문자열 CONSTANT_1CONSTANT_2을 볼 수 없습니다 대신 자신의 확장 (각각 12)로 대체 이러한 매크로와 전처리 형태로 소스를 가져옵니다 않음을 의미합니다.

-E 플래그를 사용하여 gcc을 호출하거나 특정 컴파일러에서만 사전 처리를 수행하는 모든 사전 처리 된 소스를 검사 할 수 있습니다.