” void ” 라는 용어의 유래와 왜 이것이 void라고 불리는 지에 대한 기초를 얻으려고합니다 . 이 질문의 목적은 C 경험이없고 갑자기 C 기반 코드베이스를보고있는 사람을 돕는 것입니다.
답변
기본적으로 “없음”또는 “타입 없음”을 의미합니다
void가 사용되는 3 가지 기본 방법이 있습니다.
-
함수 인수 :
int myFunc(void)
-함수는 아무 것도받지 않습니다. -
함수 반환 값 :
void myFunc(int)
-함수가 아무것도 반환하지 않음 -
일반 데이터 포인터 :
void* data
– ‘data’는 알 수없는 유형의 데이터에 대한 포인터이며 역 참조 할 수 없습니다.
참고 : void
C ++에서 in 함수 인수는 선택 사항이므로 int myFunc()
와 정확히 동일하며 int myFunc(void)
C #에서는 완전히 생략됩니다. 항상 반환 값이 필요합니다.
답변
나는 항상 결석 을 의미하는 것으로 생각 했다 . C 언어에서 이러한 결석 사용과 일치하는 네 가지 경우가 있습니다.
R f(void)
-기능 매개 변수가 없습니다void f(P)
-반환 값이 없습니다void *p
-지적 대상의 유형이 없습니다(void) p
-가치의 사용이 없다
다른 C 자손들은 다른 것들을 위해 그것을 사용합니다. D
이니셜 라이저가 어디 프로그래밍 언어는 경우에 그것을 사용 결석
T t = void;
-초기화 값이 없습니다
답변
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 */;
}
답변
“값 없음”을 의미합니다. void
함수가 값을 반환하지 않거나 매개 변수가 없거나 둘 다 없음을 나타내는 데 사용 합니다. 영어에서 void 라는 단어의 일반적인 사용과 거의 일치 합니다.
답변
함수에 반환 값이 없음을 나타냅니다.
일부 언어에는 프로 시저와 함수라는 두 가지 종류의 서브 루틴이 있습니다. 프로시 저는 일련의 작업 인 반면 함수는 결과를 반환하는 일련의 작업입니다.
C와 그 파생어에서이 둘의 차이점은 명백하지 않습니다. 모든 것이 기본적으로 기능입니다. void
키워드는 값을 반환하지 않기 때문에 그것은,에 “실제”기능이 아니다 나타냅니다.
답변
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”에주의를 기울이지 않았으므로 프로 시저에 대한 언어 키워드가 있습니다. 주로 간단한 구문 변경이지만 언어로 큰 본문 작업 코드를 얻은 후에는 얻을 수없는 것 중 하나입니다.
답변
C #에서는 void 키워드를 사용하여 메서드가 값을 반환하지 않음을 나타냅니다.
public void DoSomeWork()
{
//some work
}