다음 C ++ 코드를 고려하십시오.
void* a = &a;
컴파일러가 선언되지 않은 식별자 사용에 대해 불평하지 않는 이유는 무엇입니까?
또한 컴파일러는 변수 a
를 무엇으로 간주 합니까? void 객체에 대한 void*
포인터입니까 아니면 포인터에 대한 포인터입니까?
답변
C ++에서 변수 선언의 범위는 매우 놀랍습니다.
void* a = &a;
^~~~~~~~~~~~~~~~~
a declared as `void*` from here on
따라서, &a
이다 void**
그러나 어떤 포인터 형식 이후에 암시 적으로 변환입니다 void*
…
답변
다음과 같습니다.
void* a;
a = &a;
따라서 a
선언되었습니다. 그래서 a
에 a
쓰여진 주소를 얻 습니다 a
. 그래서 그것은 void 포인터에 대한 포인터입니다. (아직 개체를 정의하지 않았습니다.)
답변
에서 void* a
, a
아닌 포인터로 선언 void
유형하지만 “모든”유형 (특별한 경우)에. a
물론 선언되는 다른 변수와 마찬가지로 주소 (메모리의 위치)가에 할당됩니다 .
그 후, 방금 선언 된 &a
변수를 초기화하기 위해 표현식 이 평가됩니다 ( a
이는 관련이 없습니다). 의 유형 &a
은 “모든 유형에 대한 포인터에 대한 포인터”이며, “모든 유형에 대한 포인터”의 특수한 경우이며의 유형과 완전히 호환됩니다 a
. Ergo, 컴파일러 메시지가 없습니다.
결과 : void*
강력한 유형 검사를 원하는 경우 사용하지 마십시오 . 무엇이든 변환 할 수 있습니다. void*
그 자체를 제외하고는 반대 방향으로 반대입니다 (유형이 자신과 호환되지 않는 것은 불필요한 예외입니다).
또한 AFAIR는 실제로 C에서 비롯됩니다.