C 구조에서 개인 회원

2008년 5월 18일 · C에 게시됨 / C + +를

이번 주, 여기에서 일하는 사람은 G와 컴파일 좀 더 확실한 증거가 프로그래밍 패러다임을 완전히 언어 독립적인, 사실 당신은 C 프로그래밍이야 +에 의해, 즉 안 +이다했다 + + 코드를 개체 될 지향 그래서 조금은 ANSI C에서 귀하의 코드를 반드시 구성되어야한다 또는 개체를 지향 프로그래밍 없게됩니다 프로그램의 경우.

지금 읽고 있어요, 개체 오리 엔테이션은 ANSI C에서?

그렇기도하고 아니!

상속, 다형성과 오버와 같은 것들을 만들기 위하여 더욱 복잡 해집니다 / C에서 에뮬레이션,하지만 당신은 수있는 프로그램이 비슷한 행동 양식을 사용하여 개체에 대한 오리 엔테이션. libdfb C에서가 아니라 ""객체 지향, 그래서 당신이 만드는 요소가 매우 비슷한 개체의 행동을 파괴하기 위해 조작할 작성된 것입니다.

여기에 직장에서, 우리는 C에서 하드웨어 추상화의 GUI는 C에서와 연결이 시스템 + +. C에서 가장 낮은 계층도 (아주 잘 쓰여진 방법으로 말해) 이러한 기법, 객체 지향적 시뮬레이션 작성되었습니다. 이러한 기술 중 하나는, 내가 한 C의 도서들을 각주를 사용하여 공격 당했다

C 코드를 컴파일 할 때, 각각의 기호를하지 않으면 다시 다른 단위와 같은 통근 자로 명시된 경우에만이에 선언 컴파일 단위 내에서 볼 수있습니다. 따라서, 그것은 ""컴파일 단위 내의 특정 기호를 숨기려고, 그들이 외부 세계에 접근하지 못하게 만들 수있습니다. 우리는이 패키지를 가지고있다.

컴파일 유닛 파일의 집합입니다 그 후 중고 처리 및 단일 개체를 생성하는 코드를 컴파일. 기본적으로 (이 아니라 정확히), 우리가 갈 수있는 각각의 컴파일 단위를 구현 파일의 소스 코드 (*. c 팀, *. cpp를. 기타). C 및 C를 컴파일하는 단계에 대한 자세한 내용 + 블로그 Caloni에서 찾을 수있습니다.

이 정보를 사용하여, 우리는 ANSI C에서 어떤 내부 회원이 "비공개 구조체"를 만들 수있습니다. 마법의 함정 회원의 정의에서 컴파일 단위 내에 이러한 회원을위한 접근 방법을 만드십시오. 우리는 우리가 독립 선언서와 C의 요소에 대한 정의의 차이를 보여주는 각주를 사용하십시오 :

또는 선언서 선언 : 컴파일러가 훨씬 의미, 또는 컴파일러 식별자 엑스는 말씀에 대한 인사도없이,하지만 약간의 식별자를 선물 그가 상징하는 그 무엇에 대해 잘 알려져있습니다.

  a ; 통근 int;
 void ) ; 무효 나불 (무효);
 구조체 st_date; 

정의 및 구현 : 컴파일러 식별자와 같은 메모리를 얼마나 그것에 할당되어야 메모리 주소를 어디 다른 것들 중에서 무엇을 찾을 수에 따라 결정됩니다 알려줍니다.

  int;
 void ) { /* Do anything. 무효 나불 (무효) (/ * 아무것도 마십시오.  * /)
 /* Some members. (/ * 일부 회원 구조체 st_date.  * /) 

우리가 구조와 형식, 컴파일러 설정이없이는 아무것도 얘기하기 때문에 얼마나 많은 공간이 필요 유형 변수에 대해 알고있다 그들을 위해 메모리를 할당하는 방법이없습니다. 독립 선언서는 다른 한편으로, 때로는하지 않고, 링커는 그 기호가 존재하는 알 수없습니다.

우리가 헤더에, 일반적으로 우리도 거기에 우리가 우리의 소스에이 헤더를 추가할 때마다 자사의 회원을 정의하는 구조를 선언, 우리는 컴파일 단위에서이 구조의 정의는 성명을 소스로 공개 interinstitutionalcollaboration의 구성원에 포함되어 이 컴파일 유닛. 이 회사는 회원이 직접 액세스할 수있습니다.

만약 우리가 단지 기호 구조를 사용할 수 있지만 자사의 회원을 대표하는 정의의 성명을 별도. 따라서, 어떤 시도 컴파일 오류가 생성됩니다 멤버에 직접 액세스할 수있습니다. 흥미로운 부작용으로 컴파일러가 구조체의 크기에 대해 아무것도 알고있다, 당신은 직접적인 구조의 변수를 설정할 수없는, 그것만이 포인터 포인터 때문에 모두 동일한 크기와 컴파일러에만 심볼의 이름이 필요해 입력 포인터를 만들 수있습니다.

그럼 우리가 이런식으로 헤더 mytype.h 게 :

  # ifndef MY_TYPE_H
 MY_TYPE_H 정의 #

 / * typedef 아니라 구조체 단어를 계속 반복하는 것입니다.  * /
 / * 성명을 유일한 단어입니다 : * /
 / * 구조체 _MYTYPE * /
 typedef _MYTYPE my_type 구조체;

 my_type ** ) ; 무효 create_my_type (my_type **);
 my_type ** ) ; 무효 destroy_my_type (my_type **);

 my_type * , int ) ; 무효 set_data (my_type *, int);
 my_type * ) ; int get_data (my_type *);
 my_type * , const char * ) ; 무효 set_text (my_type *, const 숯불 *);
 get_text ( my_type * ) ; 숯불 * get_text (*) my_type;

 # endif 

구현 mytype.c :

 _mytype { /* Aqui fica a definição da estrtura. # "mytype.h"# #를 포함 <string.h> _MYTYPE 구조체를 포함 포함 # 포함 (/ * 여기 estrtura의 정의입니다.  data ; /* Somente depois disso é que o com-  */ int text [ 21 ] ; /* pilador vai saber como alocá-la. * / Int 데이터; / * 한정 후 그와 함께 * / int 텍스트 [21], / * pilador 알게 될 방법을 할당할 수있습니다.  ; /* Tente um sizeof(my_type) no main. * /), / sizeof 메인에 (my_type)를 사용해보십시오.  create_my_type ( my_type ** my_ptr ) { /* some code... * / 무효입니다 create_my_type (my_type ** my_ptr) (/ * 일부 코드를 ...  void destroy_my_type ( my_type ** my_ptr ) { /* some code... * /)되는 곳에서는 무효합니다 destroy_my_type (my_type ** my_ptr) (/ * 일부 코드를 ...  void set_data ( my_type * my_ptr , int d ) { /* some code... * /)되는 곳에서는 무효합니다 set_data (my_type * my_ptr, int d)에 (/ * 일부 코드를 ...  int get_data ( my_type * my_ptr ) { /* some code... * /) Int get_data (my_type * my_ptr) (/ * 일부 코드를 ...  void set_text ( my_type * my_ptr , const char * text ) { /* some code... * /)되는 곳에서는 무효합니다 set_text (my_type * my_ptr, const 숯불 * 텍스트) (/ * 일부 코드를 ...  char * get_text ( my_type * my_ptr ) { /* some code... * /) 문자 * get_text (my_type * my_ptr) (/ * 일부 코드를 ...  * /) 

완전한 소스 코드 예제는 여기에서 찾을 수있습니다.

왜냐하면 당신이 직접이 유형의 변수를 만들 수 없다, 우리가 "와"일명 ""빌더를 정의합니다.

회원에게 직접 액세스하려고하면 컴파일 오류가 발생합니다 :

  private-struct-members$ gcc -o teste mytype.h mytype.c main.c 호스트 @ 사용자 : ~ / 민간 구조체 - 회원 $ gcc가 - O를 테스트 main.c mytype.h mytype.c
 main.c : 있음 함수는 '기본':
 main.c : 22 : 오류 : dereferencing 포인터가 불완전 입력
 private-struct-members$ 호스트 @ 사용자 : ~ / 민간 구조체 - 회원 $ 

따라서, 약간의 창의력과 양쪽 언어와 패러다임의 개념과 함께, 그 코드를 구현하는 정말 흥미로운 가능합니다. 이런 바보 같은 예제에서는되었습니다 에뮬레이션 패키지 또는 생성자를 사용하여 강제로 유용 / C에서 소멸자지만, 분명하지 못한 상태일 경우 시스템에서 상황에 C를 허용하지 않습니다 + +, 복잡하거나 위험 수준, 그러한 기법에 도달하는 경향이 위대한 가치를 보여줍니다. 우리의 경우에는이 기술을 구체적으로, 전체 프로젝트 짓도 안 했어요 경험이 풍부한 프로그래머 허용, 그는 그의 시도 구조의 멤버에 직접 액세스하려면 부적 절한 콘텐츠 발견했다. 그게 없으면, 버그 cabuloso 논리가 런타임에만, 소프트웨어는 아마도 고객의 얼굴에서 폭발하고 나타납니다.

유용한 링크 ...): (또는 안
http://www.directfb.org
http://www.caloni.com.br
http://www.numaboa.com.br/informatica/c/
용지 개발 리눅스 커널

댓글

C "는 개인 회원 7 응답 구조"

  1. 디오 베로니카 6 월 10, 2008 16시 40분 Kersting

    어디에서 소스 코드를 다운로드할 수 있습니까?
    http://blabos.org/blog/wp-content/uploads/2008/02/stopwatch.zip

  2. 6 월 공포, 2008 23시 12분 10

    안녕히 주무세요,

    귀하의 관심을 주셔서 감사합니다.

    나는 결국 부러되는 블로그 서버 및 일부 링크가 변경되었습니다했습니다. 나는 그것을 해결하는 것입니다.

    포옹

  3. 6 월 공포, 2008 23시 58분 10

    마찬가지로, 바로 저기 약속

    포옹

  4. 6 월 11 일 공포, 2008 0시
  5. 로드리고 마틴 (사냥꾼) 7 월 2008 년 1시 반 15

    그것은 새로운 무언가 허 AHHuahuAHUahuA 게시 시간

  6. 7 월 15 일 공포, 2008 9시 9분

    마녀 네, 맞아요,하지만 타 osso ...

    다행히, 난 오븐에 게 :)

    포옹

  7. Carcara 10 월 2008 년 13시 14분 27

    또한 외부 컴파일 단위를 정적들을 선언 기능을 숨길 수있습니다 - 이것은 또한 전역 변수에 대한 사실입니다. 따라서 외장 드라이브의 존재와 기능을 자사의 통근 다른 파일에 선언되지 않도록 잘 고정되지 않습니다.

답글 남겨주세요




WP Hashcash에 의해 구동