programing

왜 무료의 가치가 무효로 버려지는가?

randomtip 2022. 7. 16. 15:36
반응형

왜 무료의 가치가 무효로 버려지는가?

C를 사용한 책(Programming with POSIX Threads by Butenhof, 1997)을 읽고 있는데, 다음과 같은 문구를 발견했습니다.

(void)free(data);

여기서,data할당된 구조에 대한 포인터일 뿐입니다.

data = malloc(sizeof(my_struct_t));

의 결과는 왜?free배역void?

C에 대해 제가 이해한 바로는, 이것은 두 가지 이유로 의미가 없는 것 같습니다.

  • 무료 함수가 이미 반환되었습니다.void
  • 코드가 반환 값을 사용하지 않습니다(변수에 할당되지도 않음).

그 책은 1997년에 쓰여졌다.이건 일종의 유산인가?

저자는 이 예들이 Digital Unix 4.0d에서 실행되었다고 언급하고 있지만, 그 결과를 사용하지 않는다면 함수의 결과를 캐스트해야 할 이유를 아직도 상상할 수 없다.

우리가 기준을 말한다면free그 후 그것의 원형은

void free(void *ptr);

그러므로 출연진은 전혀 쓸모가 없다.
이제 추측을 해보죠.

저자가 잊어버린 것 같습니다.stdlib.h이 프로토타입을 선언하는 헤더입니다.그래서 컴파일러는 이 프로토타입을 반환 타입으로 간주합니다.int. 이 코드의 정적 분석 중에 컴파일러는 사용되지 않은 반환값에 대해 경고했습니다.void기능.이러한 경고는 보통 에 캐스트를 추가하여 무음 처리됩니다.void.

그건 유산일 거야!

C 표준이 존재하기 전에는free()함수는 (대부분) 유형이었을 것이다.int- 아직 신뢰할 수 있는 타입이 없었기 때문입니다.void다시 돌아오기 위해서요.반환된 값이 없습니다.

표준 C 컴파일러와 함께 작동하도록 코드가 처음 수정되었을 때, 아마도 이 코드에는<stdlib.h>(표준 이전에는 존재하지 않았기 때문입니다).오래된 코드라면extern char *malloc();(아마도,extern할당 함수(에 대해 필요)calloc()그리고.realloc()선언할 필요가 없었습니다.free()코드에서는 반환값이 올바른 타입으로 캐스팅됩니다.이는 적어도 일부 시스템(C에서 학습한 시스템 포함)에서 필요했기 때문입니다.

잠시 후,(void)cast는 컴파일러에게 전달하기 위해 추가되었습니다(또는 가능성이 높은 경우,lint)는, 「로부터의 반환치」라고 하는 것입니다.free()고의로 무시당한다"고 항의를 피했다.하지만 더 낫지 않을까?<stdlib.h>그리고 그 선언이extern void free(void *vp);말하다lint무시할 가치가 없었던 컴파일러도 있습니다.

JFTR: 80년대 중반 ICL Perq는 원래 워드 지향 아키텍처와char *메모리 위치의 주소가 같은 위치에 대한 'anything_pointer'와 매우 다른 번호입니다.선언하는 것이 매우 중요했다.char *malloc()어떻게든, 그것으로부터 얻은 결과를 다른 포인터 타입으로 변환하는 것이 중요했습니다.캐스트는 실제로 CPU에서 사용되는 숫자를 변경했습니다.(또한 시스템의 메인 메모리를 1MiB에서 2MiB로 업그레이드했을 때 매우 기뻐했습니다.커널이 약 3/4MiB를 사용했기 때문에 사용자 프로그램은 페이징 전에 1/4MiB를 사용할 수 있었습니다.)

이 깁스는 필요 없습니다.C는 C89의 형태로 표준화 되어 있었기 때문에, 그 때는 아마 없었을 것입니다.

만약 그랬다면 암묵적인 선언 때문이었을 거예요이것은 보통 코드를 쓰는 사람이 잊어버렸다는 것을 의미합니다.#include <stdlib.h>이치노 것이 그냥 그렇게 하는 더 것입니다.또한 이 방법은#include <stdlib.h>선언에 관한 과 같습니다.C89를 사용하다

함수 호출에서 괄호 안의 인수 목록 앞에 있는 식이 식별자로만 구성되어 있고 이 식별자에 대해 선언이 표시되지 않으면 해당 식별자는 함수 호출을 포함하는 가장 안쪽 블록에서 선언과 동일하게 암묵적으로 선언됩니다.

extern int identifier();

나타났다.

그요.malloc중 하나 및 " " " 입니다.malloc ★★★★★★★★★★★★★★★★★」free같은 헤더 파일에 있습니다.

free결과는 반환되지 않습니다.

언급URL : https://stackoverflow.com/questions/60625906/why-cast-frees-return-value-to-void

반응형