programing

C의 매크로 범위?

yellowcard 2023. 10. 22. 20:00
반응형

C의 매크로 범위?

이러한 매크로는 어떻게 평가됩니까?

# define i 20
void fun();

int main(){
  printf("%d",i);
  fun();
  printf("%d",i);
  return 0;
}

void fun(){
  #undef i
  #define i 30
}

생산량은 2020년과 같으나 반면,

# define i 20
void fun(){
  #undef i
  #define i 30
}

int main(){
  printf("%d",i);
  fun();
  printf("%d",i);
  return 0;
}

출력은 3030입니다.설명해주세요.감사해요.

C Preprocessor는 함수 호출에 관계없이 위에서 아래로 작동합니다.매크로가 정의된 파일의 해당 지점(행)부터 해당될 때까지 유효합니다.undef번역 단위가 끝날 때까지요

그래서 당신의 암호는

# define i 20
               // from now on, all token i should become 20
void fun();
int main()
{
  printf("%d",i);   // printf("%d",20);
  fun();
  printf("%d",i);   // printf("%d",20);
  return 0;
}
void fun()
{
#undef i
              // from now on, forget token i
#define i 30
              // from now on, all token i should become 30
}

당신의 두번째 암호는

# define i 20
               // from now on, all token i should become 20
void fun()
{
#undef i
               // from now on, forget i
#define i 30
               // from now on, all token i should become 30
}
int main()
{
  printf("%d",i);    //  printf("%d",30);
  fun();
  printf("%d",i);    // printf("%d",30);
  return 0;
}

전혀 관련된 범위가 없습니다.매크로는 사전 처리 단계에서 별도로 별도로 독립적으로 처리되며 C 스코프 개념은 없습니다.예는 다음과 같습니다.

#define i 20

void fun();

int main()
{
  printf("%d",i);
  fun();
  printf("%d",i);
  return 0;
}

void fun()
{
}

#undef i
#define i 30

그리고:

#define i 20
#undef i
#define i 30

void fun()
{
}

int main()
{
  printf("%d",i);
  fun();
  printf("%d",i);
  return 0;
}

그것이 왜 그렇게 행동하는지 당신은 그것들을 보면 알 수 있습니다.

전처리기 기호에는 스코프가 있지만 해당 스코프는 파일 스코프와 같은 다른 스코프와 상호 작용하지 않습니다.

전처리기 기호 범위는 단일 번역 단위로 제한됩니다. A#define하나의 번역 단위는 다른 번역 단위와 관련이 없습니다.

전처리기 기호의 범위는 다음 명령을 따르는 토큰의 영역입니다.#defines그것을 상징하는.그 후, 매크로의 발생은 규정에 따라 인식되고 확대됩니다.전처리기 매크로 정의는 재귀적이지 않습니다.대체 토큰 시퀀스에 정의 중인 심볼의 호출처럼 보이는 내용이 포함되어 있는 경우에는 해당 내용이 인식되지 않습니다.이것이 지시 뒤에 범위가 시작되는 이유입니다.그러나 매크로가 재정의된 경우에도 마찬가지입니다. 재정의는 특수한 것이며 원래 정의와 동일하다는 규칙을 준수해야 합니다.(동일성에 대한 정확한 규칙은 표준에 있습니다.)

전처리기 기호의 범위는 번역 단위의 끝으로 끝나거나, 번역 단위의 대상이 되는 경우 이전에 종료됩니다.#undef지시의

따라서 전처리기 기호의 범위는 기본적으로 번역 단위 텍스트의 영역으로, 전처리기 토큰 스트림으로 간주되며, 이 영역에서 해당 기호는 인식 및 대체가 가능합니다.

단순히 범위가 없습니다.

매크로는 전처리기로 대체됩니다.따라서 그들의 확장은 정보원에서의 위치에 따라, 위에서 아래로 정의됩니다.

전처리기 매크로는 C 언어의 일부가 아니기 때문에 범위가 없습니다.대신 컴파일러가 제대로 실행되기 전에 실행되는 일종의 검색 대체 프로그램입니다.

전처리기는 어떤 파일이든 간단히 통과하고 C 소스 파일일 필요는 없으며 매크로 호출을 찾으면 매크로 본문의 텍스트로 대체합니다.

매크로는 컴파일 전에 별도의 단계로 소스 텍스트에 적용됩니다.매크로는 컴파일된 코드의 어떤 형태로도 더 이상 존재하지 않으며 실행 시 평가되지 않습니다.

(소스 텍스트 스캔 중에) 매크로가 호출될 때 유효한 매크로 정의는 원본 텍스트로 대체됩니다.

매크로는 C 전처리기 단계에서 평가됩니다.C 전처리기 단계는 컴파일 단계와는 별도로 발생합니다.이 때문에 매크로는 일반 범위를 따르지 않습니다.대신 원본 파일에 나타나는 순서대로 평가됩니다(따라서 위에서 아래로).

첫 번째 코드 예제에서는 i의 값을 30으로 변경해야 하는 메인 함수에서 fun()을 호출했음에도 불구하고 2020을 출력합니다. 그러나 fun 함수가 호출된 위치 아래에 나타나기 때문에 전처리기가 아직 그 지점에 도달하지 않았기 때문에 값이 변경되지 않습니다.

두 번째 코드 예제에서는 재미 기능이 메인 기능 위에 있기 때문에 3030을 출력합니다.따라서 preprocessor가 fun 함수를 이미 거치고 i의 값을 30으로 변경한 것과 반대로 발생합니다.

언급URL : https://stackoverflow.com/questions/17349387/scope-of-macros-in-c

반응형