나는 형 변환 시스템에서 못생긴 구멍의 비 승인을 보여주기 위해 단순히 캐스트를 넣었습니다.
double d;
void *p = &d;
int *q = p;
나는 그것이 존재하지 않기를 바란다. (그리고 C ++에는 없다.) 그것은 내 취향과 프로그래밍 정치를 나타냅니다. 나는 포인터를 던질뿐만 아니라 효과적으로 투표 용지를 캐스팅하고 바보 같은 악마를 캐스팅합니다 . 내가 실제로 어리 석음을 낼 수 없다면 , 적어도 항의의 몸짓으로 그렇게하고 싶은 소망을 표현하도록하자.
실제로 좋은 습관은을 malloc
반환 unsigned char *
하고 기본적으로 void *
코드에서 사용하지 않는 함수 로 랩하는 것 입니다. 당신이 일반적인 포인터 - 투 - 어떤 객체를 필요로한다면,를 사용 char *
하거나 unsigned char *
, 두 방향으로 캐스트를 가지고있다. 아마도 탐닉 할 수있는 휴식은 캐스트 memset
와 같은 함수와 memcpy
캐스트없는 함수를 사용하는 것 입니다.
캐스팅 및 C ++ 호환성 주제에서 코드를 C와 C ++로 컴파일하도록 코드를 작성하는 경우 (이 경우에 다른 값을 할당 할 때 의 반환 값 을 캐스팅 해야 함 ) 매우 도움이 될 수 있습니다. 스스로 할 것 : C ++로 컴파일 할 때 C ++ 스타일 캐스트로 변환하는 캐스팅에 매크로를 사용할 수 있지만 C로 컴파일 할 때 C 캐스트로 줄입니다.malloc
void *
/* In a header somewhere */
#ifdef __cplusplus
#define strip_qual(TYPE, EXPR) (const_cast<TYPE>(EXPR))
#define convert(TYPE, EXPR) (static_cast<TYPE>(EXPR))
#define coerce(TYPE, EXPR) (reinterpret_cast<TYPE>(EXPR))
#else
#define strip_qual(TYPE, EXPR) ((TYPE) (EXPR))
#define convert(TYPE, EXPR) ((TYPE) (EXPR))
#define coerce(TYPE, EXPR) ((TYPE) (EXPR))
#endif
이러한 매크로를 준수하는 경우 grep
이러한 식별자에 대한 코드 기반을 간단하게 검색하면 모든 캐스트가 어디에 있는지 보여 주므로 해당 매크로 가 잘못되었는지 검토 할 수 있습니다.
그런 다음 C ++로 코드를 정기적으로 컴파일하면 적절한 캐스트를 사용해야합니다. 예를 들어, 또는 strip_qual
을 제거하는 데만 사용 하지만 유형 변환이 수행되는 방식으로 프로그램이 변경되면 진단을 받고 원하는 변환을 얻으려면 캐스트 조합을 사용해야합니다.const
volatile
이러한 매크로를 고수하는 데 도움이되도록 GNU C ++ (C! 아님) 컴파일러에는 아름다운 C 기능 캐스트에 대해 생성되는 선택적 진단 기능이 있습니다.
-Wold-style-cast (C ++ 및 Objective-C ++ 만 해당)
보이드가 아닌 유형으로 캐스트 된 이전 스타일 (C 스타일)을 사용하는 경우 경고
C ++ 프로그램 내에서. 새로운 스타일의 캐스트 (dynamic_cast,
static_cast, reinterpret_cast 및 const_cast)는 덜 취약합니다.
의도하지 않은 효과와 검색하기가 훨씬 쉽습니다.
C 코드가 C ++로 컴파일되는 경우이 -Wold-style-cast
옵션을 사용하여 코드에 영향을 줄 수있는 모든 (type)
캐스팅 구문 을 찾아 위의 매크로 중에서 적절한 선택으로 대체하여 이러한 진단을 수행 할 수 있습니다. 필요한 경우 조합).
이러한 변환 처리는 "Clean C"에서 작업하기위한 가장 큰 독립 실행 형 기술 정당성입니다. C와 C ++의 결합 된 방언은 차례로 반환 값의 캐스팅을 기술적으로 정당화합니다 malloc
.