C의 void 유형이 빈 / 하단 유형과 유사하지 않은 이유는 무엇입니까?


28

Wikipedia와 내가 찾은 다른 소스 void는 빈 유형이 아닌 C 유형을 단위 유형으로 나열 합니다. 나는 void빈 / 하단 유형의 정의에 더 잘 맞는 것처럼 혼란 스럽습니다 .

  • void내가 알 수있는 한 값이 없습니다 .
  • 반환 유형이 void 인 함수는 함수가 아무것도 반환하지 않으므로 일부 부작용 만 수행 할 수 있도록 지정합니다.
  • 유형의 포인터는 void*다른 모든 포인터 유형의 하위 유형입니다. 또한 void*C 에서의 변환 은 암시 적입니다.

마지막 점이 void빈 유형이되는 것에 대한 논쟁으로 장점이 있는지 확실 void*하지 않습니다 void. 와 거의 관련이없는 특별한 경우입니다 .

반면에, void그 자체는 다른 모든 유형의 하위 유형이 아니며, 내가 알 수있는 한 유형이 하위 유형이어야한다는 것입니다.


10
"아무것도 리턴하지 않는다"는 것은 실제로 "관심있는 것을 리턴하지 않는다"를 의미하는 반면, 출력이 비어있는 함수는 전혀 리턴하지 않습니다 (예 : 충돌 또는 무한 반복).
Turion

2
리턴 유형으로서 void는 단위 유형입니다.
user253751

답변:


38

C에서는 void여러 관련없는 것들에 사용됩니다. 사용되는 내용에 따라 의미는 단위 유형, 빈 유형 또는 다른 것일 수 있습니다.

void에 대한 포인터가 void아닌 자체적으로 사용될 때 void*단위 유형, 즉 단일 값을 가진 유형입니다. 리턴 void하는 함수는 "아무것도 리턴하지 않는다"고하지만 이것이 실제로 의미하는 것은 정보를 리턴하지 않는다는 것입니다. 그들은 비트의 정보를 반환하는데, 이는 개의 고유 한 값, 즉 단위 유형 을 포함하는 유형의 값을 반환한다는 의미입니다 .020=1

빈 유형이 아닙니다. 빈 유형을 리턴하는 함수는 해당 유형의 값이 없으므로 값을 리턴 할 수 없습니다. 반환 유형이 비어있는 함수는 영원히 반복되거나 프로그램을 중단하거나 예외를 발생시킬 수 있습니다 longjmp(또는 표준 C 이외의 기능을 사용하여 다른 스레드 또는 프로세스로 제어를 전송하여 반환하지 않도록 정렬). 혼동을 피하기 위해 voidC에서는 빈 유형 대신 사용하는 것이 일반적입니다 (C에는 빈 유형이 없음).

void유형에는 비트의 저장 공간이 필요합니다 . C는 0이 아닌 전체 바이트 수의 스토리지를 차지하는 모든 객체를 주장하므로 type 객체를 생성하는 것은 금지되어 있으며 값 을 반환하는 특수 구문이 있습니다 ( 값이 생략 된 명령문). type의 값을 생성하는 구문은 없지만 반환 유형이 반환 되는 함수가있을 때마다 해당 값이 있습니다 .0voidvoidreturnvoidvoid

C는 가능한 유형을 허용한다는 의미에서 하단 유형이 없습니다. 불완전한 유형조차도 값의 일반적인 특성 (예 : 포인터 또는 구조체 또는 공용체 또는 함수)을 지정합니다. 그러나 void*함수가 아닌 유형에 대한 포인터입니다. 객체 포인터 유형의 대수에서 가장 작은 요소입니다. 즉, 맨 아래 객체 포인터 유형입니다. 일반의 경우와 달리 T*여기서 T몇몇 비 공간 유형, void*유형의 값에 대한 포인터의 형식이 아닙니다 void하지만 불특정 유형의 값에 대한 포인터의 타입.


C ++ 및 C89에서 void를 반환 할 수 있습니다. stackoverflow.com/questions/35987493/…
BartekChom

2
네 번째 단락은 공식적으로 잘못되었습니다. C에서 스토리지 양은 void0이 아닌 정의되지 않습니다. 이것이 유형의 객체 void가 허용되지 않는 이유는 아닙니다 . 공식적인 이유는 즉 void이다 불완전한 유형 및 객체는 불완전한 유형을 가질 수 없습니다.
MSalters

4
@MSalters 아니요, 내가 쓴 것은 정식입니다. "원인"은 언어 사양 내부의 논리적 추론이 아니라 언어 설계에 대한 동기를 나타냅니다. 이 void유형 에는 0 비트의 저장 공간이 필요합니다 . 이것이 C 설계자가 void0 바이트의 스토리지 (언어 디자인에 많은 영향을 줄 것임) 또는 1 바이트의 스토리지 (공간을 낭비 할 것)를 취하는 것을 정의하는 것과 달리 불완전한 타입 을 만들기로 결정한 이유 입니다. .
Gilles 'SO- 악 그만

1
@Gilles : 죄송합니다.하지만 말이되지 않습니다. 허용되는 경우 사용되는 공간 은 void type의 객체 당 1 바이트 이며 , 많은 void유형의 객체가 필요하지 않습니다 . 이러한 객체는 다른 모든 객체의 별칭을 지정할 수 있으므로 실제 사용량은 0입니다.
MSalters

4
@CodesInChaos : 음, C ++은 실제로 빈 구조체를 허용 struct E { };합니다. 기본 클래스로 사용하면 크기를 0으로 조정할 수 있습니다. (C / C ++와 같은 것은 없으며, 두 언어는 자신의 선택을하고 이러한 영역에서 다를 수 있습니다. C는 명백히 비어있는 기본 클래스를 가지고 있지 않습니다. 처음에는 OO가 없기 때문입니다)
MSalters

11

"빈 유형"이라는 이름이 혼동 될 수 있습니다. 이것이 의미하는 바는, 스스로 말했듯 이 타입에는 값이 없습니다 . "빈"은 유형의 개별 값을 나타내지 않으며 가능한 값의 집합으로 간주되는 유형 전체를 나타냅니다. 따라서 이것은 " 정보를 반환 하는 함수 는 정보를 반환하지 않습니다 "와 같은 것을 말하지 는 않지만 " 유형의 값 없습니다 "라는 말을 하지 않습니다 .void

결과 유형이 절대로 종료 될 수 없는 함수를 의미합니다 . 종료 된 경우 값을 반환해야 하지만 해당 값은 존재하지 않습니다.

또한 값이 없기 때문에 빈 유형의 값에 얼마나 많은 정보가 포함되는지에 대해 논의조차 불가능합니다. (당신 것, 같은 무의미한 문장이 "빈 유형의 값이 정보를 정확히 35,093,658 비트를 포함"경우 또는 vacuously 마찬가지입니다.) 그것은 생각하는 (정말 정확하지하지만) 다소 유용 포함하는 것으로 값 무한한 정보의 양을.

"return type"을 가진 C 함수는 void명확하게 반환 할 수 있지만 반환 값에 대한 정보는 제공하지 않습니다. 이것이 바로 단위 유형의 특징입니다. 값에는 정보가 포함되어 있지 않습니다. 하나의 값만 있기 때문입니다 (따라서 함수를 호출하지 않아도 반환 값이 무엇인지 항상 말할 수 있습니다).

Conor McBride를 인용하려면 (C로 음역) :

void"보링"을 의미합니다. 그것은 하나의 것을 포함하는 지루한 유형을 의미합니다. 보링 타입의 한 요소를 다른 요소와 비교하여 얻을 수있는 흥미로운 것은 없습니다.

그것은 빈 타입과는 매우 다르다 [...]. 빈 타입은 매우 흥미 롭습니다. 누군가 누군가 당신에게 그 가치를 부여한다면, 당신은 이미 죽었고 천국에 있고 당신이 원하는 것은 당신의 것이기 때문입니다.


흥미있는; ⊥의 정의가 리턴 유형이 ⊥ 인 함수가 절대 종료되지 않으면 C는 그러한 유형을 갖습니다. 우리는 그것을 휘발성 공극이라고 부릅니다.
Joshua

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.