2010-04-09 2 views
9

나는 구조체 이름을 항상 "struct sname"등으로 사용하는 대신 소스 코드가 항상 구조체의 typedef를 가지며 어디에서나 같은 것을 사용하는 것을 보았습니다.구조체 이름에 typedef가 있어야하는 이유는 무엇입니까?

이유가 무엇입니까? 이 작업을 수행 할 때 어떤 이점이 있습니까? 위의 typedef에서
, 모두 Entry & EntryPstruct _entry에서 따로 정의되어 쉽게

+0

그의 저서 * Expert C Programming *에서 Peter van der Linden은 구조체의 typedef가 쓸모가없고 귀찮게하지 말아야한다고 주장합니다. 나는 이것을 좋아한다. 모든 typedef는 declaratations와 prototypes와 같은 몇개의 장소에'struct'라고 쓰는 것을 절약 해줍니다. 난독화할만한 가치가 없습니다. '->'또는'.'을 사용해야 할 때를 즉시 알고 싶습니다. typedef는 이것을 더 어렵게 만듭니다. – Jens

답변

10

그것은 Box b;

typedef struct _entry{ char *name; int id; } Entry, *EntryP; 

struct boxtype b;에 비해 우위를 읽을 수 있습니다.
struct _entry *firstentry 대신 EntryP firstentry을 사용할 수 있으며 좀 더 간단하게 구문을 분석 할 수 있습니다.

참고 : 구조 이름 을 좋아하지는 이네 typedef하지만 읽기 분명히 그 쉽게해야합니다. 또한 Entry *EntryP의 사용은 전적으로 사용자에 따라 다릅니다.

+3

나는 일반적으로'EntryP'와 같은 typedef에 반대한다. C에는 이미 'Entry * firstentry'와 같이 원하는 포인터를 선언하는 완벽한 방법이 있습니다. –

+1

@Hagglund : 논쟁 할 것이 아무것도 없다. :) 그것의 주관적인,'EntryP'를 좋아할지도 모르는 반면에'EntryP'를 좋아할 수도 있습니다. –

+1

나는 그것이 주관적이라고 동의하지만,'firstentry'는 좋은 이유가 없다면'Entry * '타입이라는 사실을 추상화 한 것이므로 추천하지 않는 것이 좋습니다. 'EntryP'의 'P'는 '포인터'를 강조하기위한 것이지만, 여전히 'Entry *'는 모호하다. 어쨌든, 당신의 줄'struct entry * firstentry'는'struct _entry * firstentry'이어야한다고 생각합니다. 밑줄을주의하십시오. – SiegeX

1

불투명 한 유형을 생성 할 때 숨기는 정보의 한 형태입니다. 약간 더 긴 대답은 this SO link을 참조하십시오.

3

나는 C에서이 일을 좋아한다 : 이것처럼

// in a "public" header file 
typedef struct Example Example; 

// in a "private" header or a source file 
struct Example { ... }; 

, 내가 불투명 한 유형으로 Example을 가지고있는 대한 제외하고는 내 코드, 을 통해 (즉, 난 단지 그것에 대해 포인터를 전달할 수 있습니다) 코드가 실제로 정의 된 것을 볼 수있는 연산을 구현하는 코드. (당신은 불투명 한 타입에 대해 별도의 이름을 사용할 수는 있지만 실질적인 이점은 없습니다.)

1

C에서 타입이 정의되지 않은 구조체 이름은 유형 이름이 사용되는 모든 곳에 prepend 될 "struct"가 필요하므로 대부분의 사람들이 사용합니다 typedef를 사용하여 항상 앞에 붙은 struct 키워드가 필요없는 유형의 새 이름을 만듭니다.

이렇게하는 이유는 코드 가독성, 감소 된 타이핑 및 명확성 때문일 수 있지만 typedef는 실제로 포인터 유형에 대한 정보를 가릴 수 있습니다.

structs에 대한 새로운 이름을 만들기 위해 typedef를 사용해야한다는 것은 유물이며 C99가 C++의 단서를 따라 제거하지 못하는 것은 수치스러운 일입니다.

+0

C99는 역순으로'struct'를 없애기 위해'typedef '를 제거 할 수 없습니다. 적합성. 'struct Foo {...};와 같은 많은 코드가 있습니다. typedef ... Foo;'컴파일을 중단합니다. – JeremyP

4

C 언어에서는 홀수 쿼크이고 구조 태그 이름은 다른 네임 스페이스 (기호 테이블)에 저장됩니다. C++ 언어는이 동작을 제거했습니다. typedef는 전역 이름 공간에서 구조 유형에 대한 별칭을 만듭니다. 따라서 구조체 이름 앞에 "struct"를 입력 할 필요가 없습니다.

그가이 행동을 정의했을 때 Ritchie가 무엇을 흡연했는지 확실하지 않습니다. 필자는 초기 버전의 컴파일러에서 파서에 대한 문제를 추측하고 있습니다.

+0

모든 컴파일러가 128k 이하의 데이터 공간에 적합해야 할 때 중요했던 첫 번째 컴파일러에서 메모리 할당이 간소화되었다고 생각합니다. 사실, 가장 초기의 C 컴파일러에는 구조체 멤버 이름을위한 단일 전역 * 네임 스페이스가있었습니다. 이것은'struct foo'와'struct bar'는 둘 다'x'라는 멤버를 가질 수 없다는 것을 의미합니다.이 멤버는이 날에 공통적 인 구조체 멤버를위한 태그 스타일 ('f_x','b_x')을 직접적으로 이끌었습니다 C 코드. –

+0

@ 데이브 : 네가 맞다고 생각해. 구조 멤버 이름으로 무엇인가가 흡연 중입니다. 너무 오래되었습니다, 나는 그 뇌 세포를 오래 전에 무시한 구석에 두었습니다. 왜 와야 했어? 비? –

2

단지 코드 가독성을위한 것입니다. typedef는 데이터 유형에 대한 새로운 이름을 제공하기위한 것입니다. 대신에 원하는 곳으로 이름을 붙일 수있는 모든 곳에 int를 부여하는 대신 int를 사용하는 곳 어디에서나 당신이 지정한 새로운 이름으로 바꿀 수 있습니다. 구조체에도 똑같은 것이 적용됩니다.

0

실제로 구조체에는 typedef를 사용하지 않습니다. 왜? 나는 어떤 종류의 변수를 쉽게 볼 수 있도록 어쨌든 접두사 인 s_이라는 접두사를 사용하기 때문에.

추상적 인 데이터 유형이 많기 때문에 typedef를 사용하는 것이 좋을 것입니다. 따라서 사용자가 실제로 불투명 한 유형으로 사용합니다. 하지만 실제로는 구현에서 항상 구조체를 사용합니다.

관련 문제