구조체에 typedef를 사용하는 이유는 무엇입니까?


12

C (ANSI, C99 등)에서 구조체는 자체 네임 스페이스에 존재합니다. 링크 된리스트를위한 구조체는 다음과 같습니다 :

struct my_buffer_type {
   struct my_buffer_type * next;
   struct my_buffer_type * prev;
   void * data;
};

그러나 대부분의 C 프로그래머는 다음과 같은 구조체를 자동으로 입력하는 것이 당연합니다.

typedef struct tag_buffer_type {
   struct tag_buffer_type * next;
   struct tag_buffer_type * prev;
   void * data;
} my_buffer_type;

그런 다음 일반 유형처럼 구조체를 참조하십시오 get_next_element(my_buffer_type * ptr).

이제 내 질문은 : 이것에 대한 특별한 이유가 있습니까?

Wikipedia에 따르면 http://en.wikipedia.org/wiki/Typedef#Usage_concerns

일부 사람들은 typedef의 광범위한 사용에 반대합니다. 대부분의 주장은 typedef가 단순히 변수의 실제 데이터 유형을 숨긴다는 아이디어에 중점을 둡니다. 예를 들어 Linux 커널 해커이자 문서 작성자 인 Greg Kroah-Hartman은 함수 프로토 타입 선언 이외의 용도로는 사용하지 않는 것이 좋습니다. 그는이 관행이 불필요하게 코드를 난독화할뿐만 아니라 프로그래머가 실수로 큰 구조를 단순 유형으로 생각하여 실수로 오용 할 수 있다고 주장했다. [4]

다른 사람들은 typedef를 사용하면 코드를 더 쉽게 유지할 수 있다고 주장합니다. K & R은 typedef를 사용하는 데는 두 가지 이유가 있다고 말합니다. 첫째, 프로그램의 이식성을 높이는 수단을 제공합니다. 프로그램의 소스 파일 전체에 표시되는 모든 곳에서 유형을 변경하지 않고 단일 typedef 문만 변경하면됩니다. 둘째, typedef는 복잡한 선언을 이해하기 쉽게 만들 수 있습니다.

struct때로는 typedef'd 구조체를 사용하지 않는 별도의 네임 스페이스를 사용 하는 것의 이점이 충분하지 않으며 다른 C 프로그래밍 문화가 있기 때문에 (Windows C 프로그래밍은 Linux C 프로그래밍과는 다른 전통이 있습니다) 다른 경우 내가 알지 못하는 전통.

그런 다음 역사적 고려 사항 (전임자, C의 첫 번째 버전)에 관심이 있습니다.


4
a의 목적은 typedef 입니다 변수의 실제 유형을 숨 깁니다. 가지고 time_t예를 들어 : 사람들이 주위에 기본 정수 유형을 사용하여 이동하는 경우, 이러한 구현의 변화의 코드 엄청 많이 끊어집니다 2038에서 요구 될 일이었다. people 사람들이 이유를 이해하지 않고 구조를 사용한다면, 이는 구조가 아니라 프로그래머의 실패입니다.
Blrfl

답변:


14

나는 typedef'd 구조체를 광범위하게 사용하는 큰 프로젝트에서 일했습니다. 우리는 몇 가지 이유로 그렇게했습니다. 이것은 C99 이전과 네임 스페이스 분리였습니다.

  1. my_buffer_type *buffer대신에 입력 하는 것이 더 쉬웠 struct tag_buffer_type *buffer으며 코드베이스의 크기 (1M + loc)가 큰 차이를 보였습니다.

  2. 구조를 객체로 추상화합니다. 구조체 내의 모든 개별 변수에 중점을두기보다는 우리가 나타내는 데이터 객체에 중점을 둘 것입니다. 이러한 추상화로 인해 일반적으로 코드가 더욱 유용하고 작성하기 쉬워졌습니다.

    • 나는 이것이 당신이 제공 한 Greg Kroah-Hartman의 인용과 직접적으로 모순된다고 생각합니다. FWIW, 그 프로젝트는 커널이 아닌 클라이언트 / 서버 응용 프로그램이므로 고려해야 할 몇 가지 다른 고려 사항이 있습니다.
  3. 구조를 객체로 취급하면 정보를보다 잘 캡슐화 할 수있었습니다. 코드 검토는 새로운 개발자가 우리가 배치 한 캡슐화 원칙을 위반하는 상황을 상당히 포착했습니다. typedef'd 구조체를 사용하면 실제로 이러한 위반이 분명해졌습니다.

  4. 우리는 서버와 함께 플랫폼과 클라이언트와 함께 더 많은 플랫폼을 작성하면서 이식성이 문제가되었습니다.


5

입력하는 대신 매번

struct my_buffer_type *buffer;

당신이 typedef그것을 직접 사용할 수 있습니다

my_buffer_type *buffer;

typedef주요 용도는 코드 작성에 필요한 키 입력 횟수를 줄이고 가독성을 향상시키는 것입니다.


네 말이 맞지만 이미 내 질문 에이 사실을 설명했습니다.
wirrbel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.