constexpr 및 reinterpret_cast를 사용한 정적 const void 포인터 초기화: 컴파일러 차이점 설명
주어진 코드 조각에서 정적 constexpr const void 포인터는 reinterpret_cast를 사용하여 선언됩니다. 이 코드는 표준에 따라 어떤 컴파일러 해석이 올바른지, 그리고 그러한 표현식을 선언하는 적절한 방법이 무엇인지에 대한 의문을 제기합니다.
컴파일러 정당성
표준에 따르면 constexpr 이 경우 정적 const void 포인터와 같은 변수는 상수 표현식으로 초기화되어야 합니다. 그러나 reinterpret_cast 표현식은 C 11 표준에 따라 핵심 상수 표현식으로 간주되지 않습니다. 따라서 이 코드에 대한 오류를 보고하는 것은 clang이 맞습니다.
올바른 선언
정적 constexpr const void 포인터를 올바르게 선언하려면 다음이 필요합니다. 몇 가지 옵션이 있습니다:
사용 대신 intptr_t: 다음과 같이 intptr_t 유형을 사용하고 값을 검색할 때 이를 void 포인터로 캐스팅합니다.
static constexpr intptr_t ptr = 0x1; // ... reinterpret_cast<void*>(ptr);
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!