다른 컴파일러를 통해 다음 코드를 실행했습니다.
int main()
{
float **a;
void **b;
b = a;
}
내가 수집 할 수 있었던 것은 일반적인 포인터 void **
가 아니기 때문에 다른 포인터에서 변환 할 때 컴파일하거나 적어도 경고를 보내서는 안됩니다. 그러나 내 결과는 다음과 같습니다 (모두 Windows에서 수행됨).
- gcc- 예상대로 경고를 던집니다.
- g ++ -예상대로 오류가 발생합니다 (C ++의 덜 관용적 인 타이핑 때문입니까?)
- MSVC (cl.exe) -/ Wall을 지정해도 경고가 발생하지 않습니다.
내 질문은 : 나는 모든 것에 대해 뭔가를 놓치고 MSVC가 경고를 생성하지 않는 특별한 이유가 있습니까? 에서 로 변환 할 때 MSVC 가 경고를 생성 함 void **
float **
.
또 다른 참고 사항 : a = b
명시 적 변환으로 교체하면a = (void **)b
으로 바꾸면 어떤 컴파일러도 경고를 던지지 않습니다. 나는 이것이 잘못된 캐스트라고 생각했는데 왜 경고가 없습니까?
내가이 질문을하는 이유는 CUDA를 배우기 시작했고 공식 프로그래밍 안내서 ( https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-memory ) 에서 시작했기 때문입니다. 다음 코드를 찾을 수 있습니다 :
// Allocate vectors in device memory
float* d_A;
cudaMalloc(&d_A, size);
이는 암시 적 변환을 수행해야 void **
위한 &d_A
첫 번째 인수로서, cudaMalloc
타입이다 void **
. 문서 전체에서 비슷한 코드를 찾을 수 있습니다. 이것은 NVIDIA의 끝에서 부주의 한 작업입니까? 아니면 다시 누락 된 것입니까? nvcc
MSVC를 사용 하므로 코드가 경고없이 컴파일됩니다.
void**
일반적인 포인터가 아닙니다. 만 void*
입니다.
(void**)
명시적인 c 스타일 캐스트입니다. 컴파일러가 수행중인 작업을 자세히 보지 말고 신뢰하도록 지시합니다. 유형 안전 시스템을 명시 적으로 재정의하고 컴파일러는 기본적으로 모든 종류의 변환을 허용해야합니다. C 스타일 캐스트는 피해야합니다. 너무 강력합니다. static_cast
말이 안되는 일을하려고하면 불평 할 것 같은 C ++ 캐스트를 사용하십시오 .