오류, 버그, 질문 - 페이지 2864

 
Andrey Khatimlianskii :

왜 작동하지 않습니까?

대부분의 경우 이 접근 방식은 어디에서나 작동하지 않습니다. 왜냐하면 오른쪽의 VALUE가 정의되지 않은 대체가 있습니다.

 #define VALUE (VALUE* 2 )
 
fxsaber :

대부분의 경우 이 접근 방식은 어디에서도 작동하지 않습니다. 왜냐하면 오른쪽의 VALUE가 정의되지 않은 대체가 있습니다.

예, 다른 사람의 매크로 대체를 변경하는 것은 악입니다. 특히 이것이 사전 정의된 환경 매크로인 경우. 모든 프로젝트 파일을 빌드한 후 매크로 재정의가 결국 나타날 위치를 알 수 없습니다. 매크로 _VALUE를 정의하는 것이 좋습니다.
 
Vladimir Simakov :
예, 다른 사람의 매크로 대체를 변경하는 것은 악입니다.

이 악이 없었다면 이런 일은 일어나지 않았을 것입니다.

 
Vladimir Simakov :
예, 다른 사람의 매크로 대체를 변경하는 것은 악입니다. 특히 이것이 사전 정의된 환경 매크로인 경우. 모든 프로젝트 파일을 빌드한 후 매크로 재정의가 결국 나타날 위치를 알 수 없습니다. 매크로 _VALUE를 정의하는 것이 좋습니다.
VALUE 값을 전역 변수 에 할당하고 곱하고 최종 정의에서 대체하는 것이 불가능한 이유를 물을 수 있습니다.
 
Valeriy Yastremskiy :
VALUE 값을 전역 변수 에 할당하고 곱하고 최종 정의에서 대체하는 것이 불가능한 이유를 물을 수 있습니다.

가능하지만 매크로 대체의 의미가 손실됩니다(코드에서 값 대체). 컴파일러에 대한 모든 희망은 const 유형(그런데 변수 유형을 결정했습니까?)을 C++ constexpr 유형으로 변환하는 것입니다.

그리고 예, 당신은 할 수 있습니다

 #ifdef MACROS
   const int gValue= 2 *VALUE;
   #undef VALUE
   #define VALUE gValue
#endif
 
Vladimir Simakov :

그리고 예, 당신은 할 수 있습니다

이것을 가지고 타지 마십시오.

 void Func( int = VALUE ) {}
 
fxsaber :

이것을 가지고 타지 마십시오.

네, 그렇습니다. constexpr에 다시 물어보자. 이렇게 하면 된다.
constexpr auto x = 100 ;

void Foo( int _x = x) {
    std::cout << _x<<std::endl;
}

int main() {
    Foo();
     return 0 ;
}
 
fxsaber :

대부분의 경우 이 접근 방식은 어디에서나 작동하지 않습니다. 왜냐하면 오른쪽의 VALUE가 정의되지 않은 대체가 있습니다.

분명히 컴파일러가 어떻게 작동하는지 이해하지 못합니다. 행이 순차적으로 구문 분석됨을 나타냅니다. 따라서 오른쪽에는 정의되지 않은 값이 없습니다.

 #define VALUE 10        // VALUE = 10
#define TMP VALUE       // TMP = 10
#undef VALUE           // VALUE = EMPTY
#define VALUE (TMP* 2 )   // TMP = 10, следовательно VALUE = 20
 
Andrey Khatimlianskii :

분명히 컴파일러가 어떻게 작동하는지 이해하지 못합니다. 행이 순차적으로 구문 분석됨을 나타냅니다. 따라서 오른쪽에는 정의되지 않은 값이 없습니다.

텍스트 교체처럼 하향식으로 작동합니다. 저것들. "TMP"는 "VALUE"로 대체됩니다.

 
Andrey Khatimlianskii :

분명히 컴파일러가 어떻게 작동하는지 이해하지 못합니다. 행이 순차적으로 구문 분석됨을 나타냅니다. 따라서 오른쪽에는 정의되지 않은 값이 없습니다.

컴파일러가 아닙니다 - 전처리기입니다)

 #define VALUE (TMP* 2 )

로 변하다

 #define VALUE (VALUE* 2 )

, VALUE이(가) 정의되지 않았습니다.