0

다음과 같은 크기의 매크로를 작성했습니다. 차이점을 알고 싶었습니다.다음 코드와이 형식 캐스팅이 다른 이유는 무엇입니까?

#define my_sizeof(type) (char*)(&type+1)-(char*)(&type) 

#define my_sizeof(type) (void*)(&type+1)-(void*)(&type) 

첫번째 질문은 타입 캐스팅이 필요한 이유는, 내가 캐스팅 입력하지 않는 경우, 항상 나는 그것을 실행하여 체크 1을 반환 것을 알고있다. 나는 그 의미를 알고 싶다. (나는 그것이 컴파일러에게 무엇을하도록 지시 하는지를 의미한다.) 2ndly

,

그것이 어떤 차이를 * 문자로하고 무효 * 않습니다.?

고마워요.

+0

형식 매크로 매개 변수'type'의 이름이 잘못 지정되었습니다. 'my_sizeof (int) '를 사용하면 매크로가 작동하지 않으므로'Var'이어야합니다. –

+0

C 프로그래밍에 대한 좋은 책을 읽었습니까? 포인터 연산은 입력 된 요소에서 작동합니다! –

+0

표준 C에서 두 개의'void *'포인터를 빼낼 수는 없지만'gcc'는 이것을 확장자로 허용합니다! –

답변

2

두 번째 질문 : void 포인터 (또는 불완전한 유형에 대한 포인터)에 대한 포인터 연산이 없으므로이 작업을 전혀 수행 할 수 없습니다. 첫 번째 부분에 대한

: 포인터를 캐스팅하여 포인터를 숯불 할 수 있도록 정의, sizeof(char) == 1으로, 당신은 오히려 sizeof(type) 단위보다 1 단위의 차이를 얻을 수 - 즉, 당신이 sizeof(type)의 정확한 값을 얻을 수 .