c++ - warning - 매크로 값 재정의 또는 변경




warning c4005 매크로 재정의 (2)

그것을 define 해제하고 다시 define 할 수 있습니다.

#include <iostream>

#define AAA 13

int main()
{
    #undef AAA
    #define AAA 7
    std::cout << AAA;
}

산출물 : 7

# 로 시작하는 명령문은 코드가 컴파일되기 전에 처리 되는 전 처리기 지시문 입니다. 이 경우,이 상수 AAA 는 단순히 7 로 대체됩니다. 즉, 구문의 추가 검사없이 유형 대체 등의 텍스트 대체와 동일하게 작동합니다.

... 매크로를 사용하지 말아야하는 주된 이유는 # 정적 함수와 변수로 대체 될 수있는 매크로를 #define 정의하는 것입니다. :)

왜 "텍스트 대체"입니까?

다음 코드를 살펴보십시오.

#include <iostream>

#define AAA 13

void purePrint() {
    std::cout << AAA;
}

void redefAndPrint() {
    #undef AAA
    #define AAA 7
    std::cout << AAA;
}

int main()
{
    #undef AAA
    #define AAA 4
    purePrint();
    redefAndPrint();
    purePrint();
}

전처리 기는 위에서 아래로 한 행씩 이동합니다.

  • 아, # 정의 #define AAA 13 , 그래서 다음 번에 AAA 충돌하면, 거기에 넣을거야.
  • 보세요, purePrint는 AAA 사용합니다. 13 교체합니다.
  • 잠깐, 이제 그들은 7 을 사용하라고 말합니다. 그래서 13 사용하지 않을 것입니다.
  • 그래서 여기에 redefAndPrint() 넣을 게요 7

주어진 코드를이 코드로 변환 :

#include <iostream>

void purePrint() {
    std::cout << 13;
}

void redefAndPrint() {
    std::cout << 7;
}

int main()
{
    purePrint();
    redefAndPrint();
    purePrint();
}

13713 을 출력하고 최신 #define AAA 4 는 전혀 사용되지 않습니다.

현재 MFC C ++로 작성된 이미 개발 된 프로젝트에서 작업 중이며 이미 정의 된 매크로가있는 문제에 직면하고 있습니다.

#define HEIGHT_TESTS 13

코드 내에서 값을 변경하려고하지만 전 처리 된 정의 이후로는 그렇게 할 수 없다고 생각합니다. 전체 매크로를 변경하지 않고도이 문제를 해결할 수있는 방법이 있습니까 (프로그램의 원래 기능에 영향을 줄 수 있음). 나는 단지 하나의 특정한 조건에서 그것을 바꿀 작정이다.

모두에게 알리기 위해 필자는 사용하려고하는 값 (17)을 가진 다른 매크로 정의를 사용하여 분명히 시험해 보았습니다. 그러나 그런 행운은 없습니다.

어떤 도움이라도 대단히 감사 할 것입니다.


다음과 같은 것 :

#undef HEIGHT_TESTS
#define HEIGHT_TESTS 17

// Use redefined macro

// Restore
#undef HEIGHT_TESTS
#define HEIGHT_TESTS 13




redefinition