C 구조체 정보 숨김 (불투명 포인터)

Evox402

나는 현재 C-structs의 정보 숨김 개념과 관련하여 약간 혼란 스럽습니다.

이 질문의 배경은 OOP에 대한 지식이 거의없는 임베디드 c 프로젝트입니다.

지금까지 나는 항상 해당 모듈의 헤더 파일 내에 typedef 구조체를 선언했습니다. 따라서이 구조체를 사용하려는 모든 모듈은 구조체 유형을 알고 있습니다.

그러나 MISRA-C 검사 후 중간 심각도 경고를 발견했습니다. MISRAC2012-Dir-4.8-구조 구현이 불필요하게 번역 단위에 노출됩니다.

약간의 연구 끝에 구조체 멤버의 가시적 액세스를 비공개 범위로 제한하여 C 구조체의 정보 숨김 개념을 발견했습니다.

나는 즉시 다음과 같은 간단한 예를 시도했습니다.

struct_test.h

//struct _structName;

typedef struct _structName structType_t;

struct_test.c

#include "struct_test.h"

typedef struct _structName
{
    int varA;
    int varB;
    char varC;
}structType_t;

main.c

#include "struct_test.h"

structType_t myTest;

myTest.varA = 0;
myTest.varB = 1;
myTest.varC = 'c';

이로 인해 main.c의 경우 myTest의 크기를 알 수 없다는 컴파일러 오류가 발생합니다. 물론 main.c는 structType_t 유형의 구조체가 존재한다는 사실 만 알고 있으며 다른 것은 없습니다.

그래서 연구를 계속했고 불투명 포인터의 개념을 우연히 발견했습니다.

그래서 두 번째 시도를 시도했습니다.

struct_test.h

typedef struct _structName *myStruct_t;

struct_test.c

#include "struct_test.h"

typedef struct _structName
{
    int varA;
    int varB;
    char varC;
}structType_t;

main.c

#include "struct_test.h"

myStruct_t myTest;

myTest->varA = 1;

그리고 컴파일러 오류가 발생합니다. 불완전한 유형에 대한 포인터 역 참조 struct _structName

이 기술의 기본 개념을 이해하지 못했습니다. 내 혼동의 요점은 구조체 객체의 데이터가 어디에 있습니까?

지금까지 포인터가 일반적으로 데이터 유형의 "물리적"표현을 가리키고 해당 주소의 내용을 읽고 / 씁니다.

그러나 위의 방법을 사용하여 myTest 포인터를 선언하지만 가리키는 주소는 설정하지 않습니다.

이 게시물에서 아이디어를 가져 왔습니다. C에서 불투명 포인터 란 무엇입니까?

게시물에서 액세스는 set / get 인터페이스 메서드로 처리된다는 것이 언급되었으므로 다음과 같은 유사한 방법을 추가해 보았습니다.

void setVarA ( _structName *ptr, int valueA )
{
  ptr->varA = valueA;
}

그러나 이것은 또한 작동하지 않습니다. 이제 그가 알 수 없다고 말했기 때문에 _structName... 그래서 추가 인터페이스 메서드의 도움으로 만 구조체에 액세스 할 수 있습니다. 그렇다면 간단한 예제에서 어떻게이 작업을 수행 할 수 있습니까?

그리고 내 구조체의 객체가 메모리에 어디에 있는지 더 큰 질문이 여전히 남아 있습니다. 포인터 개념 만 알고 있습니다.

varA-주소 : 10-값 : 1

ptrA-주소 : 22-값 : 10

하지만이 예에서는

myTest-주소 : xy-값 : ??

해당 myTest포인터 의 "물리적"표현이 어디에 있는지 이해하는 데 어려움 이 있습니까?

또한 모듈의 생산자이자 소비자 인 비교적 작은 범위의 임베디드 프로젝트에서 이와 같이 수행하는 이점을 볼 수 없습니다.

누군가 1-2 명의 개발자가 코드로 작업하는 중소 규모의 임베디드 프로젝트에이 방법이 정말 합리적인지 설명해 줄 수 있습니까? 현재는 헤더 파일에서 구조체를 선언하는 것보다이 모든 인터페이스 포인터 메서드를 만드는 것이 더 많은 노력처럼 보입니다.

미리 감사드립니다

dbush

추론했듯이 이와 같은 불투명 한 유형을 사용할 때 주 소스 파일은 구조체의 멤버에 액세스 할 수 없으며 실제로 구조체가 얼마나 큰지 알지 못합니다. 이 때문에 구조체의 필드를 읽고 쓰기 위해 접근 자 함수가 필요할뿐만 아니라 라이브러리 소스 만 구조체의 정의와 크기를 알고 있기 때문에 구조체에 대한 메모리를 할당하는 함수도 필요합니다.

따라서 헤더 파일에는 다음이 포함됩니다.

typedef struct _structName structType_t;

structType_t *init();
void setVarA(structType_t *ptr, int valueA );
int getVarA(structType_t *ptr);
void cleanup(structType_t *ptr);

이 인터페이스를 사용하면 사용자가 구조체의 인스턴스를 만들고 값을 가져오고 설정하고 정리할 수 있습니다. 라이브러리 소스는 다음과 같습니다.

#include "struct_test.h"

struct _structName
{
    int varA;
    int varB;
    char varC;
};

structType_t *init()
{
    return malloc(sizeof(structType_t ));
}

void setVarA(structType_t *ptr, int valueA )
{
    ptr->varA = valueA;
}

int getVarA(structType_t *ptr)
{
    return ptr->varA;
}

void cleanup(structType_t *ptr)
{
    free(ptr);
}

typedef한 번만 정의 하면됩니다. 이것은 둘 다 유형 별칭을 정의하고 구조체를 앞으로 선언합니다. 그런 다음 소스 파일에서 실제 구조체 정의가 typedef없이 나타납니다.

init함수는 호출자가 구조체에 대한 공간을 할당하고 포인터를 반환하는 데 사용됩니다. 그런 다음 해당 포인터를 getter / setter 함수에 전달할 수 있습니다.

이제 기본 코드에서 다음과 같은 인터페이스를 사용할 수 있습니다.

#include "struct_test.h"

int main()
{
    structType_t *s = init();
    setVarA(s, 5);
    printf("s->a=%d\n", getVarA(s));
    cleanup(s);l
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C의 구조체에 대한 포인터 배열에서 정보 얻기

분류에서Dev

C의 함수에 구조체 포인터 보내기

분류에서Dev

C ++ 포인터로 함수에 전달 된 구조체 수정

분류에서Dev

불완전한 유형 구조체에 대한 C 역 참조 포인터

분류에서Dev

C 언어로 데이터 숨김 액세스 지정자 구현

분류에서Dev

C ++ 구조체 포인터 역 참조

분류에서Dev

C에서 명명되지 않은 구조체에 대한 포인터 사용?

분류에서Dev

구조체와 포인터. 불분명 한 출력

분류에서Dev

c에 정의 된 구조체에 대한 Swift 정의 이중 포인터

분류에서Dev

C 구조체, 구조체에 대한 공용체 포인터

분류에서Dev

C의 구조체 포인터 상속?

분류에서Dev

구조체와 포인터 C ++

분류에서Dev

C 구조체와 포인터 혼동

분류에서Dev

c의 중첩 된 구조체, 포인터 주소 지정 문제

분류에서Dev

포인터 + 구조체 + 정의되지 않은 C 식별자의 함수

분류에서Dev

c로 내 보낸 C ++ 함수의 클래스에 'bool'유형 또는 불투명 포인터를 사용할 수 있습니까?

분류에서Dev

구조체 포인터에 값 설정

분류에서Dev

포인터로 구조체 정의

분류에서Dev

구조체의 포인터 값 설정

분류에서Dev

구조체 멤버로 지정 일시 구조체 포인터

분류에서Dev

상주 .c 파일에서 액세스 할 수없는 불투명 포인터

분류에서Dev

sqlite3_open 호출 방법 (참조로 불투명 포인터 전달)

분류에서Dev

구조체를 보유하는 공유 포인터로 인해 C2664 오류가 발생합니다.

분류에서Dev

구조체 벡터 정렬 C ++

분류에서Dev

사용자 정의 데이터 테이블을 코드 숨김의 C # 쿼리에서 SQL 테이블과 조인하는 방법은 무엇입니까?

분류에서Dev

구조체와 포인터를 사용하는 프로그램의 불확실성 (C 언어 프로그램)

분류에서Dev

C 포인터 및 구조

분류에서Dev

함수 포인터를 포함하는 c 구조체

분류에서Dev

구조체 벡터를 정의하고 C에서 포인터로 전달-오류 : 호환되지 않는 포인터 유형에서 초기화

Related 관련 기사

  1. 1

    C의 구조체에 대한 포인터 배열에서 정보 얻기

  2. 2

    C의 함수에 구조체 포인터 보내기

  3. 3

    C ++ 포인터로 함수에 전달 된 구조체 수정

  4. 4

    불완전한 유형 구조체에 대한 C 역 참조 포인터

  5. 5

    C 언어로 데이터 숨김 액세스 지정자 구현

  6. 6

    C ++ 구조체 포인터 역 참조

  7. 7

    C에서 명명되지 않은 구조체에 대한 포인터 사용?

  8. 8

    구조체와 포인터. 불분명 한 출력

  9. 9

    c에 정의 된 구조체에 대한 Swift 정의 이중 포인터

  10. 10

    C 구조체, 구조체에 대한 공용체 포인터

  11. 11

    C의 구조체 포인터 상속?

  12. 12

    구조체와 포인터 C ++

  13. 13

    C 구조체와 포인터 혼동

  14. 14

    c의 중첩 된 구조체, 포인터 주소 지정 문제

  15. 15

    포인터 + 구조체 + 정의되지 않은 C 식별자의 함수

  16. 16

    c로 내 보낸 C ++ 함수의 클래스에 'bool'유형 또는 불투명 포인터를 사용할 수 있습니까?

  17. 17

    구조체 포인터에 값 설정

  18. 18

    포인터로 구조체 정의

  19. 19

    구조체의 포인터 값 설정

  20. 20

    구조체 멤버로 지정 일시 구조체 포인터

  21. 21

    상주 .c 파일에서 액세스 할 수없는 불투명 포인터

  22. 22

    sqlite3_open 호출 방법 (참조로 불투명 포인터 전달)

  23. 23

    구조체를 보유하는 공유 포인터로 인해 C2664 오류가 발생합니다.

  24. 24

    구조체 벡터 정렬 C ++

  25. 25

    사용자 정의 데이터 테이블을 코드 숨김의 C # 쿼리에서 SQL 테이블과 조인하는 방법은 무엇입니까?

  26. 26

    구조체와 포인터를 사용하는 프로그램의 불확실성 (C 언어 프로그램)

  27. 27

    C 포인터 및 구조

  28. 28

    함수 포인터를 포함하는 c 구조체

  29. 29

    구조체 벡터를 정의하고 C에서 포인터로 전달-오류 : 호환되지 않는 포인터 유형에서 초기화

뜨겁다태그

보관