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

 

모든 것이 가능합니다. 매크로 하나만 추가하면 됩니다.

 #define VALUE 10

MACRO( VALUE, VALUE2 )

#define VALUE   VALUE2* 2

void f( int i = VALUE ) { Print ( i ); }
void OnStart ()
{
        f();
}

결과: 20

 
A100 :

모든 것이 가능합니다. 매크로 하나만 추가하면 됩니다.

결과: 20

이것은 매우 좋습니다. 수수께끼는 풀기 어렵습니다.

 
Vladimir Simakov :

죄송합니다. 설명하려고 하는 동안 혼란스러워했습니다.

다시:

VALUE의 두 번째 정의 시 매크로 VALUE가 정의되지 않았으므로 VALUE는 다음과 같이 정의됩니다.

, TMP는 이전에도 여전히 VALUE로 정의되어 있기 때문입니다.

그러나 TMP는 VALUE의 두 번째 정의 이후에 이미

이 같은))

전처리기에서 정확히 무엇이 존재하는지 대체되며 그것이 어떻게 존재하고 어디에 정의되어 있는지는 중요하지 않습니다. 따라서 조심해야 합니다. 예시:

, 그리고 이제 함수에 악, 즉 부작용을 추가해 보겠습니다.

그리고 이것은 단지 비문이지만 보증금이이 기능에 의존한다면 어떻게 될까요?

웃기다) 언제 왔는지)

 #define VALUE 10         
#define TMP VALUE       
#undef VALUE     

올바르게 이해하면 대체 취소 후 첫 번째 행은 더 이상 10이 아니고 두 번째 TMP는 VALUE이지만 10은 아닙니다. 즉. 대체는 할당과 거리가 멀다.

 
Valeriy Yastremskiy :

웃기다) 언제 왔는지)

올바르게 이해하면 대체 취소 후 첫 번째 행은 더 이상 10이 아니고 두 번째 TMP는 VALUE이지만 10은 아닙니다. 즉. 대체는 할당과 거리가 멀다.

네. 대체는 일대일 대체일 뿐입니다. 코드로 대체할 때( 전처리기 지시문 과 혼동하지 말 것) VALUE 매크로가 정의되면 전처리기가 TMP-> VALUE-> 10을 추가로 확장하고 그렇지 않은 경우 TMP-> VALUE를 확장합니다. 동시에 전처리기 지시문은 코드 자체에 포함되지 않으며 컴파일 중에는 더 이상 존재하지 않습니다. 예시:

 #define VALUE 10
#define TMP VALUE

void OnStart ()
{
   Print (TMP); //10
if ( false ){
   #undef VALUE
   #define VALUE 20
   Print (TMP);}
else Print (TMP); //20
}
 
Vladimir Simakov :

네. 대체는 일대일 대체일 뿐입니다. 코드로 대체할 때( 전처리기 지시문 과 혼동하지 말 것) VALUE 매크로가 정의되면 전처리기가 TMP-> VALUE-> 10을 추가로 확장하고 그렇지 않은 경우 TMP-> VALUE를 확장합니다. 동시에 전처리기 지시문은 코드 자체에 포함되지 않으며 컴파일 중에는 더 이상 존재하지 않습니다. 예시:

예, 두 번째 대체 VALUE 20을 주석 처리하면 VALUE 변수 선언이 사라지고 컴파일러에서 이를 보지 못하고 꾸짖습니다)

 
A100 :

모든 것이 가능합니다. 매크로 하나만 추가하면 됩니다.

결과: 20

나는 포기한다)))

정의 방법

MACRO

?

 
Vladimir Simakov :

나는 포기 )))

정의 방법

?

너무 빨리? 아직 모든 전문가가 연결되지는 않았습니다... 일주일만 기다리겠습니다.

힌트: 이것은 또한 작동합니다(그러나 솔루션은 약간 다릅니다)

 #define VALUE1 10
#define VALUE2 5

MACRO2( VALUE1, VALUE12 )
MACRO2( VALUE2, VALUE22 )

#define VALUE1  VALUE12* 2
#define VALUE2  VALUE22* 3

int f1( int i = VALUE1 ) { return i; }
int f2( int i = VALUE2 ) { return i; }
void OnStart ()
{
        Print(f1(),":",f2());
}

결과: 20:15

 
Vladimir Simakov :

TMP가 정의된 VALUE로 유지되었기 때문입니다.

다음은 "위에서 아래로"라는 단어에 대한 반박입니다.

그렇지 않으면 TMP는 "있는 그대로" 정의되지 않고 이전에 10으로 대체되었을 것입니다(VALUE로 대체됨).

이것은 전처리기가 코드를 한 줄씩 처리하지 않는다는 것을 의미합니다. 방법을 알아내는 것이 남아 있습니다.


@A100 , 어렵지 않다면 간단히 말해서.
구글링하고 읽을 만큼 흥미롭지는 않지만 물어볼 만큼은 충분합니다.

내 논리에 무슨 문제가 있습니까?

행이 순차적으로 구문 분석됨을 나타냅니다. 따라서 오른쪽에는 정의되지 않은 값이 없습니다.

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

힌트: 이것은 또한 작동합니다(그러나 솔루션은 약간 다릅니다)

따라서 MACRO 및 MACRO2와 작동 방식이 동일합니다.

 
Andrey Khatimlianskii :

내 논리에 무슨 문제가 있습니까?

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