C 구조의 개인 회원

2008년 5월 18일 ㆍ에 게시된 C / C + +

이번 주, 여기 직장에서 프로그래밍 패러다임이 독립적으로 완벽하게 언어로 무언가이다, 즉 당신이 프로그래밍이기 때문이 아니라고 한 증거가있다 C + +와 함께 컴파일 g + + 코드는 객체 지향됩니다 그래서 조금 코드 ANSI C에서이 프로그램을 구조해야하거나 당신이 객체 지향 프로그래밍에 실격 당할면.

제가 ANSI C에서 바로 개체 오리 엔테이션을 읽고있어?

그렇기도하고 아니기도!

상속, 다형성과 오버와 같은 것들은 C에서 에뮬레이션 / 수 있도록 복잡하지만 객체 지향적으로 유사하게 행동 스타일을 사용하여 프로그램할 수 있습니다. libdfb는 C로 작성된지만 "중심 객체"는, 당신은 만들 수 있도록 훨씬 개체처럼 동작 요소를 파괴하는 조작이다.

여기 직장에서, 우리가 GUI와 연결 C에서 시스템 하드웨어 추상화가 C + +. 가장 낮은 계층은 또한 개체 방향을 시뮬레이션, 이러한 기술과 (매우 잘 작성하는 방법에 의해 말하는) C로 작성되었습니다. 한 이러한 기술은, 책을 C. 분들 각주 중 하나를 착용하여 내주의라고

그것이 또 다른 단위로 통근자로 선언되지 않는 C 코드를 컴파일하면 각 기호는, 그것이 선언되는 컴파일 단위에서만 표시됩니다. 따라서 외부 세계에 액세스할 만들고, 그 컴파일 단위 내에서 특정 기호를 "숨길"수 있습니다. 우리는이 패키지에있다.

컴파일 단위는 사전 처리와 하나의 컴파일된 오브젝트 코드를 생성 후 파일의 집합입니다. 기본적으로 (하지만 정확히), 우리는 소스 코드 (*. C, *. CPP. 등)의 각 컴파일 단위 구현 파일에 걸릴 수 있습니다. 에 대한 자세한 내용을 컴파일하는 단계 C 및 C + + 에서 찾을 수있는 블로그 Caloni .

이 정보를 사용하여, 우리는 내부 회원이있는 ANSI C에서 구조체 만들 수 있습니다 "개인을." 마법은 컴파일 단위 내의 트랩 상태의 정의에 이러한 멤버에 대한 액세스 방법을 만들 수 있습니다. 이를 위해 우리는 우리에게 선언과 C의 구성 요소 정의의 차이를 보여 각주를 사용

선언 또는 선언서 : 컴파일러가, 그 의미, 즉 대해서는별로 얘기하지 않고 식별자를 제공 식별자 XXX가 존재하는 컴파일러를 알 수 있지만, 거의 그것이 상징하는 그 무엇에 대해 잘 알려져 있습니다.

  a ; 통근자의 INT;
 void ) ; 무효 ㅋ ㅋ (무효);
 구조체 st_data; 

정의 및 구현 : 같은 메모리가 그것에 할당 무엇을해야 어느 정도로 식별자가 제공되는 컴파일러를 말해주고 우리가 다른 것들 사이에서, 그것을 찾을 수있는 메모리 주소입니다.

  INT;
 void ) { /* Do anything. 무효 ㅋ ㅋ (빈) {/ * 아무것도 마십시오.  * /}
 /* Some members. st_data 구조체 {/ * 회원 추가.  * /} 

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

우리가 헤더 구조를 선언할 때, 보통 우리는 거기에 자신의 회원을 설정하고 우리의 소스 헤더를 추가하는이 시간, 우리는이 구조의 정의로 소스 문장, 모두 공개 estutura의 구성원을 결정하는 컴파일 단위에 포함 이 컴파일 단위 수 있습니다. 이것은 우리가 직접 회원에 액세스할 수 있습니다.

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

이렇게 우리는 다음 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.h"를 포함

 Fopen
 # 포함
 # <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. ;} / * 메인에 sizeof (my_type)를보십시오.  * /

 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 문자 * 문자) {/ * 몇 가지 코드 ...  * /}
 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 + +, 또는 복잡 위험 수준에 도달하는 경향이, 이러한 기술이 어디에 허용하지 않습니다 큰 가치가 표시됩니다. 우리의 경우,이 기술은 특히 구조의 멤버에 직접 액세스할 그의 시도가, 콘텐츠 부적 절한 것을 발견 전체 프로젝트를, 참석하지 않았 경험이 프로그래머를 허용했다. 그것없이는, 버그 카불 로직은 소프트웨어가 아마도 고객의 얼굴에 폭발하고, 오직 런타임에 나타납니다.

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

댓글

  • 디오고 V. Kersting

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

  • 수다

    안녕히 주무세요

    관심을 가져 주셔서 감사합니다.

    제가 블로그 서버를 변경했고 일부 깨진 링크를 결국. 나는이 문제를 해결합니다.

    포옹

  • 수다

    약속대로, 그는이 있습니다

    포옹

  • 수다
  • 로드리고 마틴 (마녀)

    새로운 허 AHHuahuAHUahuA 무언가를 게시하려면 그것은 시간

  • 수다

    마녀가 그래요, 당신 말이 맞아,하지만 뼈 괜찮 ...

    다행히, 나는 오븐에 게 :)

    포옹

  • Carcara

    당신은 또한 그들이 정적 선언 외부로 함수 컴파일 단위를 숨길 수 있습니다 - 이것은 또한 전역 변수에 대한 사실입니다. 따라서 외부 드라이브는 존재를 알 수 없습니다 그리고 정적 함수가 다른 파일에있는 통근자로 선언되는 것을 방지할 수 있습니다.

Disqus에 의해 전원 블로그 코멘트