programing

이 표현은 무엇을 의미하며 왜 컴파일됩니까?

prostudy 2022. 7. 28. 21:06
반응형

이 표현은 무엇을 의미하며 왜 컴파일됩니까?

오타가 발생한 후 다음 식(간소화)이 컴파일되어 실행되었습니다.

if((1 == 2) || 0 (-4 > 2))
  printf("Hello");

당연히 0은 없어야죠.

컴파일되는 이유와 그 표현은 무엇을 의미합니까?

원본(간체)은 다음과 같습니다.

if((1 == 2) || (-4 > 2))
  printf("Hello");

이 중 어느 것도 컴파일되지 않습니다.

if((1 == 2) || true (-4 > 2))
  printf("Hello");

if((1 == 2) || 1 (-4 > 2))
  printf("Hello");

if((1 == 2) || null (-4 > 2))
  printf("Hello");

이것은 특정 '함수가 정의되지 않은' 관용구를 지원하기 위한 Visual C++ 확장인 것처럼 보입니다.경고 C4353 페이지에서 다음을 수행합니다.

// C4353.cpp
// compile with: /W1
void MyPrintf(void){};
#define X 0
#if X
   #define DBPRINT MyPrint
#else
   #define DBPRINT 0   // C4353 expected
#endif
int main(){
    DBPRINT();
}

라는 취지DBPRINT수술 금지입니다.이 경고는#define DBPRINT __noop대신 VC의 __noop 확장자를 사용합니다.

출력 어셈블리 목록을 보면 디버깅모드에서도 두 번째 구가 생략되어 있음을 알 수 있습니다.

그건 아마도

if((1 == 2) || NULL (-4 > 2))
  printf("Hello");

여기서 NULL은 함수 포인터이며 기본적으로는 int...를 반환합니다.실제로 실행 시 발생하는 일은 플랫폼에 따라 다릅니다.

Visual Studio 2012는 다음과 같은 경고를 제공합니다.

경고 C4353: 비표준 내선번호 사용: 함수식으로 상수 0.대신 '_noop' 기능을 사용합니다.

표현식 평가 지점에 "작동 안 함" 어셈블러 명령을 삽입하는 비표준 방법입니다.

사실 이것은 마이크로소프트 고유의 것입니다.

디버깅을 위해 internal을 사용할 수 있습니다.이것에 의해, 함수와 파라메타가 평가되지 않게 됩니다.

사용자의 경우 Microsoft 컴파일러는 0을 사용하여 동일한 작업을 수행하려고 한다고 생각하기 때문에 작동하지만 VS2012에서는 다음과 같은 경고를 보냅니다.

warning C4353: nonstandard extension used: constant 0 as function expression.  Use '__noop' function intrinsic instead.

상세한 것에 대하여는, http://msdn.microsoft.com/en-us/library/2a68558f(v=vs.71).aspx 를 참조해 주세요.

ubuntu에서는 에러가 표시된다.

int main()
{
 if((1 == 2) || 0 (-4 > 2))
      printf("Hello");
}

op

niew1.c:3:19: error: called object â0â is not a function

아마0여기서 함수 포인터에 캐스트됩니다.명시적 캐스팅은 다음과 같습니다.

if((1 == 2) || ((int (*)(int)) 0) (-4 > 2)) 
      printf("Hello");

단, 어떤 기능이 있는지 짐작할 수 없습니다.0이 예에서는 에 암시적으로 캐스팅되어 있습니다.

언급URL : https://stackoverflow.com/questions/17858488/what-does-this-expression-mean-and-why-does-it-compile

반응형