문제

공허 포인터와 관련하여 C와 C ++의 차이점을 이해하려고합니다. C ++는 C ++가 아닌 다음에 컴파일됩니다 (GCC/G ++ -ANSI -PEDANCY -WALL로 수행 한 모든 컴파일) :

int* p = malloc(sizeof(int));

왜냐하면 malloc 보고 void*, C ++가 할당하지 않는 것 int* C는 그것을 허용합니다.

그러나 여기 :

void foo(void* vptr)
{
}

int main()
{
    int* p = (int*) malloc(sizeof(int));
    foo(p);
    return 0;
}

C ++와 C는 모두 불만없이 컴파일합니다. 왜요?

K & R2 Say :

객체에 대한 모든 포인터는 타입으로 변환 될 수 있습니다. void * 정보 손실없이. 결과가 원래 포인터 유형으로 다시 변환되면 원래 포인터가 복구됩니다.

그리고 이것은 예쁜 모든 부분이 있습니다 void* C의 전환 C ++ 표준은 무엇을 지시합니까?

도움이 되었습니까?

해결책

C에서, 포인터 변환 void* 항상 암시 적이었습니다.

C ++에서 전환 T* 에게 void* 암시 적이지만 void* 다른 것에는 캐스트가 필요합니다.

다른 팁

C ++는 C보다 강하게 유형됩니다. 특히 가치에 대한 다른 해석을 암시하는 많은 변환은 명시적인 변환이 필요합니다. 그만큼 새로운 C ++의 연산자는 명시적인 캐스트없이 힙에 메모리를 할당하는 타입 안전 방법입니다.

포인터 유형 변환은 추가 CPU 명령을 실행할 필요가 없다는 것을 이해하는 것이 유용합니다. 컴파일 시간 동안 개발자의 강도를 이해하기 위해 분석됩니다. void * 불투명 한 포인터입니다. 뾰족한 물체의 유형은 알려져 있지 않다고 말합니다. C는 약하게 입력되었습니다. (void *) 그리고 어떤 (T*) 암시 적으로. C ++는 강력하게 입력되었습니다. (void *) 에게 (T*) 강력하게 타이핑 된 언어에 대해 실제로 좋은 사례를 만들지는 않을 것입니다. 그러나 C ++는 C와 호환되는 거꾸로 유지해야했기 때문에 그러한 전환을 허용해야했습니다. 그런 다음 지침 원칙은 다음과 같습니다. 명시 적은 암시적인 것보다 낫습니다. 따라서 변환하려면 (void*) 특정에 (T*) 포인터, 코드에 명시 적으로 작성해야합니다. (T*) 에게 (void*) (void*) 포인터에서 직접 할 수있는 일이 많지 않기 때문에 명시적인 변환이 필요하지 않습니다 (하지만 무료 ()를 호출 할 수 있음). 따라서 (T*) 에게 (void*) 변환은 거의 안전합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top