programing

#만약 정의된다면 (x) || (y) ; 이것이 유효합니까?

powerit 2023. 10. 5. 23:36
반응형

#만약 정의된다면 (x) || (y) ; 이것이 유효합니까?

한 번의 리뷰에서 다음과 같은 코드를 발견했습니다.

#if defined(x) || y

위 문장은 무엇을 의미합니까? 조건이 제대로 실행됩니까?

네, 유효합니다.

6.10p1의 표준(C99)은 다음과 같이 말합니다.

if-group:
# if constant-expression new-line groupopt
# ifdef identifier new-line groupopt
# ifndef identifier new-line groupopt

defined연산자는 상수 식(6.10.1p1)의 단항 연산자 부분으로 간주됩니다.

예를 들어, 매크로의 경우 조건이 참인 것으로 평가됩니다.x다음과 같은 경우에 정의됩니다.y정의되며 다음과 다릅니다.0

이에 대한 추론은 두 가지입니다.

A를 사용하는 대신#ifdef, 당신은 사용합니다.defined논리 연산자를 사용할 수 있도록 연산자(&&,||, 정의해야 할 내용에 대한 기준이 여러 개인 경우 코드가 제대로 포함되도록 코드를 복제할 필요가 없습니다.

또한, 제 생각에는 다음과 같이 읽기가 훨씬 쉽다고 생각합니다.#if defined(x)보다#ifdef x, 그리고 당신은 다음을 할 수 있습니다.#if defined(x) && defined(y), 하지만 그건 가능하지 않아요#ifdef.

네, 그 이후로defined(x)는 부울이고 true 또는 false를 반환합니다.

위 문장은 "x가 정의되거나 y가 참"임을 의미합니다.

그것은 옳지만 나쁜 관행입니다.하나의 조건에서 두 개의 다른 평가('y'와 'defined(x))를 사용하는 이유는 무엇입니까?다른 사람들에게는 혼란스러울 수도 있습니다.아래 예는 #정의된 매크로에 대한 || 및 && 연산자의 더 일반적인 사용을 보여줍니다.

#define AA  1
#define BB  2
#if (defined AA) || (defined BB)
    #warning "A or B"
#endif
#if (defined AA) && (defined BB)
    #warning "A and B"
#endif

위 코드가 실행되면 다음 메시지가 화면에 나타납니다.

#warning "A or B"
#warning "A and B"

그러나 코드가 이와 같다면 (AA는 정의되지 않았습니다):

#undefine AA
#define BB  2
#if (defined AA) || (defined BB)
    #warning "A or B"
#endif
#if (defined AA) && (defined BB)
    #warning "A and B"
#endif

그러면 사용자는 다음과 같은 메시지를 받게 됩니다.

#warning "A or B"

언급URL : https://stackoverflow.com/questions/9946108/if-defined-x-y-is-this-valid

반응형