C, C ++ 및 C #에서 void는 무엇을 의미합니까?


170

" void " 라는 용어의 유래와 왜 이것이 void라고 불리는 지에 대한 기초를 얻으려고합니다 . 이 질문의 목적은 C 경험이없고 갑자기 C 기반 코드베이스를보고있는 사람을 돕는 것입니다.


2
이 질문에는 3 개의 언어가 혼합되어 있습니다. 레거시 질문은 3 개의 다른 질문으로 나누어 져야합니다.
Stargateur

답변:


225

기본적으로 "없음"또는 "타입 없음"을 의미합니다

void가 사용되는 3 가지 기본 방법이 있습니다.

  1. 함수 인수 : int myFunc(void) -함수는 아무 것도받지 않습니다.

  2. 함수 반환 값 : void myFunc(int) -함수가 아무것도 반환하지 않음

  3. 일반 데이터 포인터 : void* data - 'data'는 알 수없는 유형의 데이터에 대한 포인터이며 역 참조 할 수 없습니다.

참고 : voidC ++에서 in 함수 인수는 선택 사항이므로 int myFunc()와 정확히 동일하며 int myFunc(void)C #에서는 완전히 생략됩니다. 항상 반환 값이 필요합니다.


7
인수 목록에서 void는 C ++에서 선택 사항입니다. stackoverflow.com/questions/416345/…
Daniel Earwicker 2016 년

1
"크기 없음"보다는 "타입 없음"을 사용합니다
Kjetil Joergensen

@Earwicker와 kjetijor, 내가 토론 한 좋은 점이지만 잠 못 드는 마음에 도움이 필요했습니다.) 감사합니다.
Gerald

9
동의하지는 않지만 void를 추가로 사용하는 것은 사용되지 않은 값에 대한 경고를 억제하는 "cast to void"트릭입니다. 컴파일러가 실제로 해석하는 방식과 일치하지 않기 때문에 약간의 확장이지만 "이 값을 사용하여 아무것도하지 않는다"는 의미로 해석 할 수 있습니다.
Steve Jessop

22
C ++에서 인수 목록의 void는 선택 사항입니다. 그러나 C에서는 선택 사항이 아닙니다. foo ()는 모든 유형의 매개 변수를 사용한다는 의미이고 foo (void)는 매개 변수가 0임을 의미합니다.
Adam Rosenfield 2016 년

33

나는 항상 결석 을 의미하는 것으로 생각 했다 . C 언어에서 이러한 결석 사용과 일치하는 네 가지 경우가 있습니다.

  • R f(void)-기능 매개 변수가 없습니다
  • void f(P)-반환 값이 없습니다
  • void *p-지적 대상의 유형이 없습니다
  • (void) p-가치의 사용이 없다

다른 C 자손들은 다른 것들을 위해 그것을 사용합니다. D이니셜 라이저가 어디 프로그래밍 언어는 경우에 그것을 사용 결석

  • T t = void;-초기화 값이 없습니다

4
무엇을 (void)p합니까? 나는 "가치 사용이 없다"라는 의미를 얻지 못했습니다.
Yashas

@Yashas 누군가도 (void) var;진술 에 대해 혼란 스러우면 stackoverflow.com/q/21045615 에서 자세한 답변을 찾았습니다 .
Arnie97

14

void를 사용하는 방법에는 두 가지가 있습니다.

void foo(void);

또는

void *bar(void*);

첫 번째는 인수가 전달되지 않거나 인수가 리턴되지 않음을 나타냅니다.

두 번째는 컴파일러에 데이터와 관련된 유형이 없다는 것을 알려줍니다. 즉, 알려진 유형으로 캐스팅 될 때까지 데이터를 사용할 수 없습니다.

예를 들어 void* , 미리 매개 변수를 알 수없는 함수를 호출하는 인터페이스가 있으면 많이 사용되는 것을 수 있습니다.

예를 들어, 작업을 연기 할 때 Linux 커널에서 나중에 실행할 함수에 대한 포인터와 함수에 전달할 데이터에 대한 포인터를 제공하여 나중에 실행할 함수를 설정합니다.

struct _deferred_work {
sruct list_head mylist;
.worker_func = bar;
.data        = somedata;
} deferred_work;

그런 다음 커널 스레드는 지연된 작업 목록을 검토하고이 노드에 도달하면 효과적으로 실행됩니다.

bar(somedata);

그런 다음 바에는 다음이 있습니다.

void bar(void* mydata) {
    int *data = mydata;
    /* do something with data */;
}

13

"값 없음"을 의미합니다. void함수가 값을 반환하지 않거나 매개 변수가 없거나 둘 다 없음을 나타내는 데 사용 합니다. 영어에서 void 라는 단어의 일반적인 사용과 거의 일치 합니다.


4

함수에 반환 값이 없음을 나타냅니다.

일부 언어에는 프로 시저와 함수라는 두 가지 종류의 서브 루틴이 있습니다. 프로시 저는 일련의 작업 인 반면 함수는 결과를 반환하는 일련의 작업입니다.

C와 그 파생어에서이 둘의 차이점은 명백하지 않습니다. 모든 것이 기본적으로 기능입니다. void키워드는 값을 반환하지 않기 때문에 그것은,에 "실제"기능이 아니다 나타냅니다.


3

void를 "빈 구조"로 생각하십시오. 설명하겠습니다.

모든 함수는 일련의 매개 변수를 사용하며 각 매개 변수에는 유형이 있습니다. 실제로 매개 변수에 해당하는 구조 슬롯을 사용하여 매개 변수를 구조로 패키징 할 수 있습니다. 이것은 모든 함수가 정확히 하나의 인수를 갖도록합니다. 마찬가지로 함수는 결과를 생성하며 결과는 유형을 갖습니다. 부울이거나 부 동일 수 있거나 임의의 다른 유형 값 세트를 포함하는 구조 일 수 있습니다. 반환 값이 여러 개인 언어를 원한다면 구조로 패키지화한다고 주장하기 쉽습니다. 사실, 우리는 항상 함수가 구조체를 반환했다고 주장 할 수있었습니다. 이제 모든 함수는 정확히 하나의 인수를 취하여 정확히 하나의 값을 생성합니다.

이제 "아니오"값을 생성하는 함수가 필요할 때 어떻게됩니까? 글쎄, 내가 3 개의 슬롯으로 구조체를 만들 때 얻는 것을 고려하십시오 : 3 개의 값을 보유합니다. 두 개의 슬롯이 있으면 두 개의 값을 보유합니다. 하나의 슬롯이 있으면 하나의 값입니다. 그리고 제로 슬롯이 있으면, 제로 값 또는 "아니오"값을 가지므로 void를 반환하는 함수는 값이없는 구조체를 반환하는 것으로 생각할 수 있습니다. 언어의 키워드가 아닌 빈 구조로 표시되는 유형의 동의어 일뿐입니다 (사전 정의 된 유형일 수 있음).

마찬가지로 값이 필요없는 함수는 빈 구조 (예 : "void")를 허용하는 것으로 생각할 수 있습니다.

프로그래밍 언어를 이런 식으로 구현할 수도 있습니다. void 값을 전달하면 0 바이트가 걸리므로 void 값을 전달하는 것은 임의의 크기의 다른 값을 전달하는 특별한 경우입니다. 이렇게하면 컴파일러가 "void"결과 또는 인수를 쉽게 처리 할 수 ​​있습니다. 함수 결과를 버릴 수있는 언어 기능을 원할 것입니다. C에서 다음 명령문에서 무효가 아닌 결과 함수 foo를 호출하면 foo (...); 컴파일러는 foo가 결과를 생성한다는 것을 알고 단순히 무시합니다. void가 값이면, 이것은 완벽하게 작동하고 이제 "절차"(공백 결과가있는 함수에 대한 형용사)는 일반적인 함수의 사소한 특수한 경우 일뿐입니다.

무효 *는 조금 더 재미 있습니다. 나는 C 디자이너들이 위와 같은 방식으로 공허하다고 생각하지 않았다. 그들은 방금 키워드를 만들었습니다. 이 키워드는 누군가 임의의 유형에 대한 포인트가 필요할 때 사용할 수 있으므로 C의 관용구로 void *입니다. void를 빈 구조로 해석하면 실제로 잘 작동합니다. void * 포인터는 빈 구조가 놓여진 장소의 주소입니다.

다른 유형 T의 경우 void *에서 T *로 캐스트도이 관점에서 해결됩니다. 포인터 캐스트는 복합 유형 T에 하위 유형 S가있는 요소가 스토리지 레이아웃에서 T의 시작 부분에 물리적으로 배치 된 경우 S *를 T *로 캐스팅한다는 사실을 이용하기 위해 가장 일반적인 아키텍처에서 작동하는 완전한 치트입니다. 대부분의 머신 포인터는 단일 표현을 갖기 때문에 동일한 물리적 머신 주소를 사용하는 경우도 마찬가지입니다. 타입 S를 보이드 타입으로 바꾸면 정확히 같은 효과를 얻을 수 있으므로, 보이드 * 로의 캐스팅이 가능합니다.

PARLANSE 프로그래밍 언어는 위의 아이디어를 매우 밀접하게 구현합니다. 우리는 디자인에 뛰어 들었고, 반환 유형으로 "void"에주의를 기울이지 않았으므로 프로 시저에 대한 언어 키워드가 있습니다. 주로 간단한 구문 변경이지만 언어로 큰 본문 작업 코드를 얻은 후에는 얻을 수없는 것 중 하나입니다.



2

void의 세 가지 사용 사례 :

  1. 기능 서명. void foo(int bar)값을 반환하지 않습니다. int bar(void)매개 변수를 사용하지 않지만 일반적으로 빈 인수 목록으로 표시됩니다 int bar(). 여기서 void 키워드의 사용법은 영어의 의미에 해당합니다.

  2. void *지정되지 않은 데이터를 가리키고 역 참조 할 수없는 일반 최상위 유형 포인터 . 여기서 void의 의미는 void의 다른 의미와는 다릅니다 : 범용 유형 대 유형 없음.

  3. (void) new Foo(this)반환 값이 일부러 버려 졌음을 나타내는 캐스트 . 여기서 키워드 사용법은 영어의 의미와도 일치합니다.

사례 1과 사례 2는 이미 @Gerald에서 다루었지만 사례 3은 아직 다루지 않았습니다.


2

초보자에게 개념을 설명하는 경우 유추를 사용하는 것이 도움이 될 수 있습니다. 이 모든 경우에 void를 사용하는 것은 "이 페이지는 의도적으로 비워 두었습니다."라는 단어가있는 책의 페이지와 유사합니다. 컴파일러로 오류로 표시 해야하는 것과 의도적으로 비워 두어야 할 유형을 원하는 동작으로 구분하는 것입니다.

항상 반환 유형이나 포인터 유형과 같은 유형이 나타날 것으로 예상되는 코드에 항상 나타납니다. 이것이 C #에서 void가 실제 CLR 형식 인 System.Void에 매핑되는 이유는 그 자체가 형식이기 때문입니다.

일부 인간 문화에서는 숫자 0의 개념을 발명 한 적이없는 것처럼 일부 프로그래밍 언어는 void 개념을 개발하지 않았습니다. Void는 프로그래밍 언어에서 인간의 언어에 대한 0의 개념과 같은 진보를 나타냅니다.


마지막 문장에 관한 참고 사항-정적으로 입력 된 언어에만 해당됩니다. 동적으로 유형이 지정된 언어는 메소드가 단순히 아무것도 리턴하지 않기 때문에 void가 필요하지 않습니다. "void"는 리턴되는 다른 것이 없기 때문에 암시됩니다.
Mark Embling

마지막 의견 수정-마지막 단락 (문이 아님)을 말하려고했습니다.
Mark Embling

1

"값 없음"을 의미합니다. void를 사용하면 함수가 값을 반환하지 않거나 매개 변수가 없거나 둘 다 없음을 나타내며, 영어에서 void라는 단어의 일반적인 용도와 매우 일치합니다.

무효는 null과 혼동해서는 안됩니다. Null은 주소가 스택에있는 변수를 의미하며 해당 주소의 힙 값은 비어 있습니다.


0

Void는 메소드 서명에서만 사용됩니다. 리턴 유형의 경우 메소드가 호출 코드에 아무것도 리턴하지 않음을 의미합니다. 매개 변수의 경우 매개 변수가 메서드에 전달되지 않습니다.

예 :

void MethodThatReturnsAndTakesVoid(void)
{
// Method body
}

C #에서는 매개 변수에 대한 void를 생략하고 위 코드를 다음과 같이 작성할 수 있습니다.

void MethodThatReturnsAndTakesVoid()
{
// Method body
}

무효는 null과 혼동해서는 안됩니다. Null은 주소가 스택에있는 변수를 의미하며 해당 주소의 힙 값은 비어 있습니다.


0

무효는 정의상 lvalue가 될 수없는 불완전한 유형입니다. 즉, 값을 할당 할 수 없습니다.

따라서 어떤 가치도 가질 수 없습니다.



-1

무효는 세 언어 모두에서 함수의 리턴 유형에 값이 필요하지 않음을 의미합니다.


-1

Void는 Visual Basic의 Sub와 같습니다.


반환 유형으로 만 사용하십시오. void 인수 (함수는 아무것도 취하지 않음), void 포인터 (포인터 유형이 지정되지 않음) 및 void 캐스트 (폐기 값)의 세 가지 추가 사용을 생각할 수 있습니다.
c4757p 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.