C의 구조에 개인 회원

5 월 18, 2008 · 안으로 배치하는 +는 C / C +

이번 주, 작품 여기에서, 당신은 C + +에서 프로그래밍하기 때문에 그렇지 즉, 귀하의 코드가 지향 객체됩니다 + +를 g으로 컴파일, 더 많은 증거를 프로그래밍 패러다임 뭔가 완전히 독립적인 언어입니다했다 는 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_data; 

정의하거나 구현 : 12km로 컴파일러는 식별자가 다른 것을 결정 가운데 메모리 그럴만도 많이하는 방법 등, 할당에 어떤 메모리, 그것을 찾을 수있는 주소는 우리가.
예 :

  int;
 void ) { /* Do anything. 무효의 블라 (무효) (/ * 아무것도 마십시오.  * /)
 /* Some members. 회원 추가 st_data 구조체 (/ * 있습니다.  * /) 

우리가 구조와 유형, 아무것도에 대해 알고 있기 때문에 그들을 위해 메모리를 할당할 수 없습니다 컴파일러를 설정하지 않고 말할 공간이 얼마나 필요 해당 유형의 변수. 반면에, 때로는 선언하지 않고, 링커가 그 상징의 존재를 알 수 없습니다.

우리가 일반적으로 우리는 거기 때마다 우리는 우리의 원천이 머리글을 추가 회원을 정의 헤더의 구조를 선언, 우리는 컴파일 단위에 포함된 그 구성원을 만드는이 구조의 정의로서 두 원본 문장, 우리의 전체 공개 이 컴파일 단위. 이것은 우리가 직접 자사의 회원을 액세스할 수 있습니다.

구조를 사용할 수 있지만 회원 나타내는 우리는 정의의 성명을 별도로하는 경우에만 상징. 따라서, 회원이 직접 액세스 시도, 컴파일 오류를 생성합니다. 흥미로운 부작용은 컴파일러 구조의 크기에 대해 아는게 하나로서, 당신은 직접, 단지 포인터 위치로 포인터가 모두 같은 크기와 컴파일러를 가지고 있기 때문에 단지 기호의 이름을 필요로 형식 구조의 변수를 설정할 수 없습니다 유형의 포인터를 만듭니다.

이런식으로 우리는 다음 mytype.h 헤더 :

  # Ifndef의 MY_TYPE_H
 #은 MY_TYPE_H 정의

 / * 구조체 typedef는 단어가 반복뿐 아니라 유지합니다.  * /
 / *이 문을 *에만 단어 : /
 / * *이 구조체의 _mytype /
 typedef는 my_type를 구조체 _mytype의;

 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 char *로);
 get_text ( my_type * ) ; char *로의 get_text (my_type 번호 *);

 # endif 

구현은 mytype.c :

  # 포함 "mytype.h"

 # <stdio.h>
 #은 <stdlib.h> 포함
 #은 <string.h> 포함

 /* Aqui fica a definição da estrtura. _mytype는 *를 구조체 (/ 여기 estrtura 정의입니다.  * /
     /* Somente depois disso é que o com-  */ int 날짜;와 - *, / * 후에만 /
     21 ] ; /* pilador vai saber como alocá-la. int 텍스트를 할당 알고 [21]을하는 방법 / pilador는 것입니다 *.  * /
 /* Tente um sizeof(my_type) no main. ), / * 기본 (my_type)에서 sizeof를 사용해보십시오.  * /

 my_type ** my_ptr ) { /* some code... 무효의 create_my_type (my_type my_ptr **) (/ * 일부 코드를 ...  * /)
 my_type ** my_ptr ) { /* some code... 무효의 destroy_my_type (my_type my_ptr **) (/ * 일부 코드를 ...  * /)
 my_type * my_ptr , int d ) { /* some code... set_data 무효 (* my_type의 my_ptr, int d)에 (/ * 일부 코드 ...  * /)
 my_type * my_ptr ) { /* some code... int get_data (my_type의 my_ptr 번호 *) (/ * 일부 코드를 ...  * /)
 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 char *로 (* my_type의 my_ptr) (/ * 일부 코드를 ...  * /) 

완전한 소스 코드 예제를 찾을 수있는 이곳 .

직접 우리가 "와"소멸자 ""빌더를 정의해야합니다 이런 종류의 변수를 만들 수 없기 때문에.

회원에게 직접 액세스 시도는 컴파일 오류가 발생합니다 :

  private-struct-members$ gcc -o teste mytype.h mytype.c main.c 사용자 @ 호스트 : ~ / 개인 - 구조체 - 회원 $ gcc가 - 아 테스트 main.c mytype.h mytype.c
 main.c : 함수에서 '기본 :
 main.c : 22 : 오류 : dereferencing 포인터 형식으로 불완전
 private-struct-members$ 사용자 @ 호스트 : ~ / 개인 - 구조체 - 회원 달러 

따라서, 약간의 창의성과 두가지의 패러다임으로 언어의 개념을 복용, 당신은 정말 흥미로운 코드를 구현할 수 있습니다. 이 바보 같은 예제에서 캡슐 또는 생성자의 사용이 C / 소멸자하지만, 시스템의 상황에서 C + +, 또는 복잡성을 허용하지의 에뮬레이션을 강요의 유용성을 명확하지 않을 수도, 그러한 기술을 위험 수준에 도달하는 경향이 있습니다 큰 가치를 보여줍니다. 우리의 경우이 기술은 구체적으로 누구는 전체 프로젝트를 놓친 경험이 풍부한 프로그래머 허용, 그는 구조의 구성원에게 자신의 시도가 직접 액세스 발견, 부적 절한 콘텐츠했다. 그게 없으면, 버그 카불의 논리가 런타임에만이 소프트웨어는 아마도 고객의 얼굴에서 폭발하고 나타납니다.

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

댓글

    블로그 Disqus에 의해 제공 코멘트