>  기사  >  백엔드 개발  >  reinterpret_cast를 사용하여 정적 constexpr const void 포인터를 초기화하는 것이 합법적입니까?

reinterpret_cast를 사용하여 정적 constexpr const void 포인터를 초기화하는 것이 합법적입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-12 03:35:01919검색

Is it legal to initialize a static constexpr const void pointer using reinterpret_cast?

constexpr 및 reinterpret_cast를 사용한 정적 const void 포인터 초기화: 컴파일러 차이점 설명

주어진 코드 조각에서 정적 constexpr const void 포인터는 reinterpret_cast를 사용하여 선언됩니다. 이 코드는 표준에 따라 어떤 컴파일러 해석이 올바른지, 그리고 그러한 표현식을 선언하는 적절한 방법이 무엇인지에 대한 의문을 제기합니다.

컴파일러 정당성

표준에 따르면 constexpr 이 경우 정적 const void 포인터와 같은 변수는 상수 표현식으로 초기화되어야 합니다. 그러나 reinterpret_cast 표현식은 C 11 표준에 따라 핵심 상수 표현식으로 간주되지 않습니다. 따라서 이 코드에 대한 오류를 보고하는 것은 clang이 맞습니다.

올바른 선언

정적 constexpr const void 포인터를 올바르게 선언하려면 다음이 필요합니다. 몇 가지 옵션이 있습니다:

  1. 사용 대신 intptr_t: 다음과 같이 intptr_t 유형을 사용하고 값을 검색할 때 이를 void 포인터로 캐스팅합니다.

    static constexpr intptr_t ptr = 0x1;
    // ...
    reinterpret_cast<void*>(ptr);
  2. GCC/clang 확장: GCC와 clang은 다음을 사용하여 약간 문서화된 확장을 지원합니다. __builtin_constant_p:

    static constexpr const void* ptr = 
      __builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? 
        reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1) ;

이 표현식은 두 컴파일러 모두에 의해 상수 접혀집니다. 그러나 이 확장은 표준의 일부가 아니며 향후 버전의 컴파일러에서는 지원되지 않을 수 있습니다.

위 내용은 reinterpret_cast를 사용하여 정적 constexpr const void 포인터를 초기화하는 것이 합법적입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.