2016-07-05 2 views
3

매크로가 세그먼트에 메모리를 할당합니까? 그렇다면 어떤 메모리 세그먼트 NUMBER이 저장되어 있습니까?매크로가 메모리를 할당합니까?

#define NUMBER 10 
+1

출처 : https://gcc.gnu.org/onlinedocs/cpp/Object-like-Macros.html#Object-like-Macros. _ "객체와 유사한 매크로는 코드 조각으로 대체 될 간단한 식별자입니다 ... 그러면 C 전처리 기가 매크로를 인식하고 확장합니다 ... C 컴파일러는"토큰 "을 작성한 경우와 동일한 토큰을 보게됩니다. _ –

+1

'NUMBER '는 (컴파일러의 힙에서) 컴파일 타임에 동적 메모리를 할당합니다. 컴파일 된 프로그램에는 할당이 없습니다. 적어도 매크로는 아닙니다. – i486

+0

글쎄요, 메모리를 '.text' ([code segment] (https://en.wikipedia.org/wiki/Code_segment)) 섹션에 채워 넣으면됩니다. ;) 매번 코드에 사용됩니다. – LPs

답변

7

아니요, 매크로는 그렇게 작동하지 않습니다.

전 처리기으로 대체됩니다. 컴파일러NUMBER을 볼 수 없습니다. 보이는 모든 문자는 10입니다.

이와 관련하여 C 및 C++은 동일합니다.

3

매크로에 할당 된 메모리가 없습니다. 코드를 컴파일 할 때 매크로는 사용되는 모든 장소에서 기계적으로 그 값으로 대체됩니다.

1

이 정의는 프로그램에 메모리를 할당하지 않습니다.

그냥 전 처리기 (컴파일러의 일부)에 NUMBER의 토큰 인스턴스를 대체하여 10으로 바꾸라고 알려줍니다.

아마 전처리기에 일부 바이트를 할당합니다. 사전 컴파일 단계에서 - -

1

자체로 #define가 메모리를 차지하지 않고, 무슨 일 컴파일러입니다 귀하의 경우, 정의와 코드 번호의 모든 항목을 대체 (10)

2

없음, 매크로는 메모리를 할당하지 않습니다.

이 문은 변수 할당과 같지 않으므로 메모리는 할당되지 않습니다. 사전 처리기은 컴파일 전에 작동합니다.

NUMBERpre-processing 단계에만 관련이 있으며 런타임에 ID가 없습니다. 전처리 과정에서 NUMBER의 모든 인스턴스는 10으로 대체됩니다. 따라서 10은 정수 리터럴 (컴파일 타임)이기 때문에 런타임시 메모리 요구 사항이 없습니다.

link을 참조하십시오.

2

아니요, 일반적으로 #define 지시문은 이 아니므로 메모리를 할당하십시오.

자세히 말하면, #define은 교체 지시문입니다. 전처리 단계에서 텍스트로 대체됩니다.

그래서,

#define NUMBER 10 
. 
. 
. 
if (val == NUMBER) 

같은 텍스트 코드는 전처리 후

if (val == 10) 

것 같습니다. 따라서 #define으로 정의 된 MACRO 대체는 별도의 메모리를 사용하지 않습니다. FWIW, 대체 (리터럴) 값은 코드 세그먼트에서 보통 자리를 차지합니다 (, 직접 litreal 값을 사용하여 나중에 형식을 작성한 경우와 같음, MCARO가없는 경우).

관련, C11, 장 §5.1.1.2/P4에서 번역 단계

전처리 지시문이 실행은 매크로 호출은 확장되고, _Pragma 단항 연산자 표현식이 실행됩니다. [...]

관련 문제