programing

C의 불투명 포인터는 무엇입니까?

prostudy 2022. 7. 3. 09:57
반응형

C의 불투명 포인터는 무엇입니까?

C의 불투명 포인터 컨셉의 사용법과 로직을 알 수 있을까요?

불투명 포인터는 기본 데이터에 대한 세부 정보가 드러나지 않는 포인터입니다(사전 정의: 불투명: 형용사; 투과할 없음; 투명하지 않음).

예를 들어 헤더 파일에서 선언할 수 있습니다(이것은 실제 코드의 일부에서 가져온 것입니다).

typedef struct pmpi_s *pmpi;

는 '형식'을 선언합니다.pmpi불투명한 구조에 대한 포인터입니다. struct pmpi_s 「」, 「」, 「」라고한 것은 「」입니다.pmpi불투명 포인터가 됩니다.

이 선언의 사용자는 다음과 같은 코드를 자유롭게 작성할 수 있습니다.

pmpi xyzzy = NULL;

구조의 실제 "정의"도 모른 채 말이죠.

있는 즉, 「」의 입니다.pmpi처리: 구조물을 "수정"할 수 있습니다.

struct pmpi_s {
    uint16_t *data;     // a pointer to the actual data array of uint16_t.
    size_t sz;          // the allocated size of data.
    size_t used;        // number of segments of data in use.
    int sign;           // the sign of the number (-1, 0, 1).
};

헤더 파일 사용자가 수행할 수 없는 개별 필드에 쉽게 액세스할 수 있습니다.

자세한 내용은 위키피디아 페이지에서 확인할 수 있습니다.

이 기능은 주로 라이브러리 사용자에게 구현 세부 정보를 숨기는 데 사용됩니다.캡슐화(C++의 군중으로부터 전해지는 내용에도 불구하고):-)는 오랫동안 존재해 왔습니다.

사용자가 라이브러리를 효과적으로 사용할 수 있을 만큼만 라이브러리에 세부 정보를 게시하고 그 이상은 게시하지 않습니다.더 많은 정보를 게시하면 사용자가 신뢰할 수 있는 세부 정보를 얻을 수 있습니다(예: 크기 변수).sz구조 내의 특정 위치에 있기 때문에 사용자가 사용자의 제어를 무시하고 직접 조작할 수도 있습니다.

그러면 내부 제품을 바꾸면 고객들의 불만이 심해질 거예요.이 구조 정보가 없으면 API는 제공하는 것만으로 제한되며 내부 작업에 대한 자유는 유지됩니다.

불투명 포인터는 프로그래밍 인터페이스(API)의 정의에 사용됩니다.

일반적으로 다음과 같이 선언된 불완전한 구조 유형에 대한 포인터입니다.

typedef struct widget *widget_handle_t;

그 목적은 클라이언트프로그램에 API에 의해 관리되는 오브젝트에 대한 참조를 유지하는 방법을 제공하는 것입니다.메모리 내의 주소(포인터 자체) 이외의 오브젝트의 실장에 대해서는 아무것도 밝히지 않습니다.

클라이언트는 객체를 전달하고, 자신의 데이터 구조에 저장하며, 동일한지 다른지에 관계없이 두 개의 포인터를 비교할 수 있지만, 포인터를 참조 해제하여 객체에 무엇이 있는지 확인할 수는 없습니다.

이렇게 하는 이유는 클라이언트 프로그램이 이러한 세부 사항에 종속되는 것을 방지하고 클라이언트 프로그램을 다시 컴파일하지 않고도 구현을 업그레이드할 수 있도록 하기 위함입니다.

불투명한 포인터가 입력되어 있기 때문에, 타입의 안전성을 충분히 측정할 수 있습니다.다음과 같은 경우:

typedef struct widget *widget_handle_t;
typedef struct gadget *gadget_handle_t;

int api_function(widget_handle_t, gadget_handle_t);

이 이루어집니다.는 "A"가 "A"로 되어 있기 때문입니다. 왜냐하면struct gadget *로 변환됩니다.struct widget *깁스 없이

그것이 우리가 정의하고자 하는 이유입니다.struct, 각 타입, 「」struct다른 선언에서는 에 선언한 'Declaration'과 되지 않는 됩니다.structtypes.timeout.

고객이 의존하게 되는 것은 어떤 의미입니까?라고 가정해 봅시다.widget_t에는 폭 및 높이 속성이 있습니다.다음과 같이 합니다.

typedef struct widget {
  short width;
  short height;
} widget_t;

그러면 클라이언트는 다음과 같이 너비와 높이를 얻을 수 있습니다.

int widget_area = whandle->width * whandle->height;

반면 불투명한 패러다임에서는 (인라인되지 않은) 접근 기능을 사용해야 합니다.

// in the header file
int widget_getwidth(widget_handle_t *);
int widget_getheight(widget_handle_t *);

// client code
int widget_area = widget_getwidth(whandle) * widget_getheight(whandle);

「 」가 어떻게 있는지 해 주세요.widget은 '아예'를 shorttype을 지정하면 구조체의 공간을 절약할 수 있습니다.또, 이 타입은 비표준 인터페이스의 클라이언트에 공개되어 있습니다. 위젯의 에 맞지 않는다고 가정해 .short구조가 바뀌어야 합니다.

typedef struct widget {
  int width;
  int height;
} widget_t;

이 새 정의를 선택하려면 클라이언트 코드를 지금 다시 컴파일해야 합니다.툴 및 도입 워크플로우에 따라서는 이 작업이 수행되지 않을 수도 있습니다.오래된 클라이언트 코드는 새로운 라이브러리를 사용하려고 하고 오래된 레이아웃을 사용하여 새로운 구조에 액세스함으로써 동작이 잘못됩니다.이는 동적 라이브러리를 사용하면 쉽게 발생할 수 있습니다.라이브러리는 업데이트되지만 종속 프로그램은 업데이트되지 않습니다.

불투명 인터페이스를 사용하는 클라이언트는 변경되지 않고 계속 작동하므로 재컴파일이 필요하지 않습니다.액세스 기능의 새로운 정의를 호출할 뿐입니다. 파일은 , 새 파일을 .int입력된 값을 지정합니다.

지금까지도 (그리고 현재도) 여기저기서)를 사용하는 데 있어서도 빈약한 관행이 있었다는 점에 주의해 주십시오.void *불투명 핸들 유형으로 입력합니다.

typedef void *widget_handle_t;
typedef void *gadget_handle_t;

int api_function(widget_handle_t, gadget_handle_t);

이 스킴에서는 진단 없이 다음 작업을 수행할 수 있습니다.

api_function("hello", stdout);

Microsoft Windows API는 두 가지 방법을 모두 사용할 수 있는 시스템의 예입니다.기본적으로는 다음과 같은 다양한 핸들 유형이 있습니다.HWND(손잡이) 및HDC(디바이스 컨텍스트)가 모두void *따라서 타입의 안전성은 없습니다.HWNDA가 지나갈 수 있는 곳HDC예상된 것입니다.이렇게 하면:

#define STRICT
#include <windows.h>

그런 다음 이러한 핸들을 서로 호환되지 않는 유형에 매핑하여 오류를 탐지합니다.

이름에서 알 수 있듯이 불투명한 것은 우리가 볼 수 없는 것이다.예: 나무는 불투명합니다.불투명 포인터는 정의 시 콘텐츠가 노출되지 않은 데이터 구조를 가리키는 포인터입니다.

예:

struct STest* pSTest;

할당하는 것이 안전합니다.NULL이치노

pSTest = NULL; 

언급URL : https://stackoverflow.com/questions/7553750/what-is-an-opaque-pointer-in-c

반응형