콜백을 사용하는 라이브러리 (ENet)를 사용하고 있습니다. 이러한 콜백 함수에서 사용자 데이터 용 void *가 포함 된 구조체를 전달합니다. 그 변수를 사용하고 싶지만 포인터가 아닙니다. 메모리를 할당하기를 원하지 않기 때문에 size_t를 저장하기 위해 void *의 공간을 직접 사용하고 싶습니다.엄격한 앨리어싱 경고를 피할 수있는 방법이 있습니까?
그러나 예상대로 void * 변수를 size_t 변수로 캐스팅하면 엄격한 별칭 경고가 표시됩니다. 그리고 콜백의 구조체는 void * 이외의 다른 것으로 그것을 액세스하기위한 공용체를 제공하지 않습니다.
나는이 경고를 완전히 해제 할 수 있음을 알고 있지만, 나는이 특별한 경우를 위해 침묵으로하고 싶다. 경고를 피하기 위해 컴파일러가 의도적임을 알 수있는 이런 종류의 캐스트를 작성하는 방법이 있습니까?
편집 : 여기
내가 할 노력하고있어의 예입니다.
size_t& offset = reinterpret_cast<size_t&>(packet->userData);
이 작동하지만 경고를 제공합니다 : I는 사용자 값을 편집 할 수 있어야하기 때문에, 나는 또한에 대한 참조를 잡으려고 노력하면서 size_t로 캐스팅하고 있습니다. 예상대로
어떤 언어로 작업하고 있습니까? –
C++, C 라이브러리 사용 – Nairou
엄격한 앨리어싱이 무엇인지 이해하고 있습니까? 왜 그것을 위반하는 것이 나쁜 생각입니까? 경고를 비활성화하면 코드가 미쳐 버릴 수 있습니다. 컴파일러는'size_t &'에 대한 변경으로 인해'void * &'가 변경 될 수 있다고 가정하고 변경 사항을 무시하고 레지스터에'void * & '값을 저장합니다. .. – Yakk