2012-11-18 6 views
6

C 전 처리기가 코드를 몇 번 통과합니까? 내가 GCC에 다음 코드로 테스트C 전처리 기는 몇 패스로 만드나요?

오류가 없다 4.7.2

#define a 5 
#define b a 
#define c b 
#define d c 
#define e d 
#define f e 
#define g f 
#define h g 
#define j h 
#define k j 
#define l k 
#define m l 

int main(void) {return d;} 

:

$ gcc -E 1.c 
# 1 "1.c" 
# 1 "<command-line>" 
# 1 "1.c" 
# 14 "1.c" 
int main(void) {return 5;} 

이 표준 동작인가가?

+5

왜 오류가 있습니까? –

답변

13

C 프리 프로세서는 더 이상 확장 할 필요가 없을 때까지 계속 진행됩니다. 패스의 문제는 아닙니다. 그것은 완전 함의 문제입니다.

매크로의 재귀 확장을 피할 수 있습니다. 한 번 매크로가 확장되면 대체 텍스트에서 다시 확장되지 않습니다.

The implementation shall be able to translate and execute at least one program that contains at least one instance of every one of the following limits:18)

...

  • 4095 macro identifiers simultaneously defined in one preprocessing translation unit

18) Implementations should avoid imposing fixed translation limits whenever possible.

그래서, 전처리가 적어도 4095 처리 할 수 ​​있어야합니다 :


표준 매크로 확장에 한계에 대해 말한다 유일한 것은 그것이 말하는 §5.2.4.1 번역 제한에 매크로 중 하나를 제외한 모든 매크로가 예제와 같이 순차적으로 다른 매크로로 확장되면 그 결과는 정확해야합니다.