C, C++, C#에서 보이드는 무엇을 의미하는가?
"void"라는 용어가 어디서 왔는지, 그리고 왜 그것이 보이드라고 불리는지에 대한 기본을 알아내려고 한다.질문의 의도는 C 경험이 없고, 갑자기 C 기반의 코드베이스를 바라보고 있는 사람을 보조하는 것이다.
기본적으로 "아무것도" 또는 "종류 없음"을 의미한다.
보이드를 사용하는 3가지 기본 방법이 있다.
함 수 있음:
int myFunc(void)
-- 함수는 아무 것도 필요 없다.값: 함 수 있음 값:
void myFunc(int)
-- 함수는 아무 것도 반환하지 않음일반 데이터 포인터:
void* data
- 'data'는 알 수 없는 유형의 데이터에 대한 포인터로, 참조 해제할 수 없음
참고:void
함수 인수는 C++에서 선택적이므로int myFunc()
와 정확히 같다int myFunc(void)
, 그리고 그것은 C#에서 완전히 배제된다.그것은 항상 반환가치에 필요하다.
나는 항상 결석을 의미한다고 생각해 왔다.다음은 C 언어에서 이러한 부재 사용과 일치하는 네 가지 사례다.
R f(void)
- 함수 파라미터가 없음void f(P)
- 반품가치가 없음void *p
- 지적된 유형의 부재(void) p
- 가치사용불가
다른 C 후손들은 그것을 다른 것에 사용한다.D 프로그래밍 언어는 이니셜라이저가 없는 경우에 이 언어를 사용한다.
T t = 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
함수가 값을 반환하지 않거나 매개 변수 또는 둘 다 없음을 나타냄영어에서 보이드의 일반적인 용어와 거의 일치한다.
함수에 반환 값이 없음을 나타낸다.
어떤 언어들은 절차와 기능이라는 두 가지 종류의 서브루틴을 가지고 있다.절차란 단지 운영의 연속일 뿐이고, 함수는 결과를 반환하는 운영의 연속이다.
C와 그 파생상품에서 둘 사이의 차이는 명백하지 않다.모든 것은 기본적으로 기능이다.그void
키워드는 값을 반환하지 않기 때문에 "수신" 함수가 아니라는 것을 나타낸다.
공허함을 "빈 구조"라고 생각해라.내가 설명할게.
모든 함수는 매개변수의 순서를 취하며, 각 매개변수에는 유형이 있다.사실, 우리는 파라미터를 파라메터에 해당하는 구조 슬롯으로 구조물로 포장할 수 있다.이것은 모든 기능이 정확히 하나의 주장을 갖도록 만든다.이와 비슷하게 함수는 결과를 생성하는데, 이 결과는 유형이 있다.부울일 수도 있고, 부유일 수도 있고, 임의로 입력된 다른 값 집합을 포함하는 구조일 수도 있다.만약 우리가 복수의 수익 가치를 갖는 나르지를 원한다면, 그것들은 하나의 구조로 포장되어 있다고 주장하기 쉽다.사실, 우리는 항상 어떤 기능이 구조를 반환한다고 주장할 수 있다.이제 모든 함수는 정확히 하나의 주장을 취하며, 정확히 하나의 값을 산출한다.
자, 이제 "없음" 값을 생성하는 기능이 필요할 때 어떤 일이 일어날까?음, 내가 3개의 슬롯을 가진 구조체를 만들 때 얻을 수 있는 것을 생각해봐: 그것은 3개의 값을 가지고 있어.슬롯이 두 개 있으면 두 개의 값이 들어 있다.슬롯이 하나일 때 값 하나.슬롯이 없으면...0 값 또는 "아니오" 값.따라서 공허를 반환하는 함수는 아무런 값도 포함하지 않는 구조물을 반환하는 것으로 생각할 수 있다.당신은 심지어 "void"가 언어의 키워드보다는 빈 구조로 대표되는 타입의 동의어일 뿐이라고 결정할 수 있다(아마 사전 정의된 타입일 것이다).
마찬가지로 값을 요구하지 않는 함수를 빈 구조(예: "void")를 받아들이는 것으로 생각할 수 있다.
나는 내 프로그래밍 언어를 이런 식으로 구현할 수도 있어.보이드 값을 전달하면 0바이트를 차지하기 때문에 보이드 값을 전달하면 임의 크기의 다른 값을 전달하는 특별한 경우일 뿐이다.이것은 컴파일러가 "void" 결과나 주장을 쉽게 다룰 수 있게 한다.당신은 아마도 함수 결과를 버릴 수 있는 랭귀지 기능을 원할 것이다; C에서 만약 당신이 다음 문장에서 비보이드 결과 함수 foo를 foo(...;;;;;; 컴파일러는 foo가 결과를 생산한다는 것을 알고 그것을 단순히 무시한다.공백이 하나의 값이라면, 이것은 완벽하게 작동하고 이제 "절차"(공백 결과가 있는 함수에 대한 형용사일 뿐)는 일반적인 기능의 사소한 특수한 경우일 뿐이다.
Void*는 좀 더 웃긴다.나는 C 디자이너들이 위와 같은 방식으로 공허함을 생각했다고 생각하지 않는다; 그들은 단지 키워드를 만들었을 뿐이다.그 키워드는 누군가 임의의 타입에 대한 포인트가 필요할 때 사용 가능했고, 따라서 C의 관용어로 보이드*가 필요했다.공허함을 빈 구조로 해석하면 실제로 꽤 효과가 있다.void* pointer는 그 빈 구조가 놓여진 곳의 주소다.
다른 유형 T의 경우 보이드*에서 T*까지 캐스트도 이러한 관점으로 해결한다.포인터 캐스트는 복합형 T가 스토리지 레이아웃에서 T의 시작 부분에 물리적으로 배치된 S형 소자를 가지고 있다면 S*에서 T*까지, 그리고 그 반대의 경우 대부분의 기계가 ha를 포인터하기 때문에 동일한 물리적 머신 주소를 사용하여 작동하는 경향이 있다는 점을 이용하기 위해 대부분의 일반적인 아키텍처에서 작용하는 완전한 부정행위다.단일 대표제를 실시하다타입 S를 타입 void로 교체하면 정확히 동일한 효과가 나타나며, 따라서 void*에 대한 캐스팅이 이루어진다.
PARLANSE 프로그래밍 언어는 위의 아이디어를 매우 가깝게 구현한다.우리는 그것의 디자인을 엉망으로 만들었고, 리턴 타입으로 "void"에 주의하지 않았고, 따라서 절차에 대한 언어 키워드를 가지고 있다.그것은 대부분 단순한 구문 변화일 뿐이지만, 언어의 큰 신체 부호를 일단 얻으면 얻을 수 없는 것 중 하나이다.
무효에 대한 세 가지 사용 사례:
함수 서명.
void foo(int bar)
값을 반환하지 않는다.int bar(void)
매개 변수를 사용하지 않지만 일반적으로 빈 인수 목록으로 표시됨:int bar()
여기서 void 키워드를 사용하는 것은 영어의 의미와 일치한다.일반 탑타입 포인터
void *
지정되지 않은 데이터를 가리키며 참조 해제할 수 없다.여기서 보이드의 의미는 보이드의 다른 의미와 다르다: 보편적 유형 대 무 유형이다.다음과 같은 깁스에서
(void) new Foo(this)
반환 값이 의도적으로 버려진다는 것을 나타내기 위해.여기서 키워드 사용법도 영어의 의미와 일치한다.
사례 1과 사례 2는 이미 @Gerald에 의해 다루어졌지만 사례 3은 아직 다루어지지 않았다.
초심자에게 개념을 설명하고 있다면 비유를 해보는 것이 도움이 될 수 있다.이 모든 경우에 공백의 사용은 "이 페이지는 의도적으로 비워두었다"라는 다음 단어가 있는 책의 한 페이지와 의미가 유사하다.그것은 컴파일러에게 오류로 플래그가 붙어야 할 것과 그것이 당신이 원하는 행동이기 때문에 의도적으로 비워두어야 하는 유형을 구별하는 것이다.
일반적으로 반환 형식 또는 포인터 형식과 같은 유형이 나타날 것으로 예상되는 코드에는 항상 표시된다.이것이 C#에서 보이드가 실제 CLR 유형인 시스템에 매핑되는 이유다.그 자체가 하나의 유형이기 때문에 공허하다.
어떤 프로그래밍 언어는 보이드의 개념을 발전시키지 못했는데, 마치 어떤 인간 문화는 숫자 0의 개념을 발명하지 못한 것처럼 말이다.보이드는 프로그래밍 언어에서 0의 개념이 인간의 언어에 나타내는 것과 동일한 발전을 나타낸다.
C#에서는 boid 키워드를 사용하여 메서드가 값을 반환하지 않음을 나타낼 수 있다.
public void DoSomeWork()
{
// Some work
}
Void는 정의상 lvalue일 수 없는 불완전한 유형이다.그것은 값을 할당할 수 없다는 것을 의미한다.
그래서 그것은 또한 어떤 가치도 가질 수 없다.
보이드는 메서드 서명에만 사용된다.반송 유형의 경우, 이 방법은 호출 코드에 어떤 것도 반환하지 않는다는 것을 의미한다.매개 변수의 경우 매개 변수가 메소드에 전달되지 않음을 의미한다.
예:
void MethodThatReturnsAndTakesVoid(void)
{
// Method body
}
C#에서 매개변수에 대한 공백을 생략할 수 있으며 위의 코드를 다음과 같이 쓸 수 있다.
void MethodThatReturnsAndTakesVoid()
{
// Method body
}
보이드는 null과 혼동해서는안 된다.Null은 주소가 스택에 있고 해당 주소에 대한 힙의 값이 비어 있는 변수의 평균을 의미한다.
Void는 Visual Basic의 Sub에 해당한다.
void는 함수나 방법에서 값을 반환하지 않는다는 것을 의미한다.
Void는 3개 언어의 함수에서 반환 형식에 어떤 값도 필요하지 않음을 의미한다.
참조URL: https://stackoverflow.com/questions/1043034/what-does-void-mean-in-c-c-and-c
'programing' 카테고리의 다른 글
Vuex mapState 기능에 유형을 제공하는 방법 (0) | 2022.04.15 |
---|---|
SweetAlert2 html 출력에서 v-for를 사용하는 방법 (0) | 2022.04.15 |
Vuex Store는 콘솔 또는 클라이언트 브라우저에서 액세스할 수 있는가? (0) | 2022.04.15 |
비트 시프트는 엔디안성에 따라 달라지는가? (0) | 2022.04.14 |
20 랜덤 바이트 배열을 만드는 방법 (0) | 2022.04.14 |