나는 구조체 이름을 항상 "struct sname"등으로 사용하는 대신 소스 코드가 항상 구조체의 typedef를 가지며 어디에서나 같은 것을 사용하는 것을 보았습니다.구조체 이름에 typedef가 있어야하는 이유는 무엇입니까?
이유가 무엇입니까? 이 작업을 수행 할 때 어떤 이점이 있습니까? 위의 typedef
에서
, 모두 Entry
& EntryP
이 struct _entry
에서 따로 정의되어 쉽게
나는 구조체 이름을 항상 "struct sname"등으로 사용하는 대신 소스 코드가 항상 구조체의 typedef를 가지며 어디에서나 같은 것을 사용하는 것을 보았습니다.구조체 이름에 typedef가 있어야하는 이유는 무엇입니까?
이유가 무엇입니까? 이 작업을 수행 할 때 어떤 이점이 있습니까? 위의 typedef
에서
, 모두 Entry
& EntryP
이 struct _entry
에서 따로 정의되어 쉽게
그것은 Box b;
typedef struct _entry{ char *name; int id; } Entry, *EntryP;
struct boxtype b;
에 비해 우위를 읽을 수 있습니다.
struct _entry *firstentry
대신
EntryP firstentry
을 사용할 수 있으며 좀 더 간단하게 구문을 분석 할 수 있습니다.
참고 : 구조 이름 을 좋아하지는 이네 typedef
하지만 읽기 분명히 그 쉽게해야합니다. 또한 Entry *
대 EntryP
의 사용은 전적으로 사용자에 따라 다릅니다.
나는 일반적으로'EntryP'와 같은 typedef에 반대한다. C에는 이미 'Entry * firstentry'와 같이 원하는 포인터를 선언하는 완벽한 방법이 있습니다. –
@Hagglund : 논쟁 할 것이 아무것도 없다. :) 그것의 주관적인,'EntryP'를 좋아할지도 모르는 반면에'EntryP'를 좋아할 수도 있습니다. –
나는 그것이 주관적이라고 동의하지만,'firstentry'는 좋은 이유가 없다면'Entry * '타입이라는 사실을 추상화 한 것이므로 추천하지 않는 것이 좋습니다. 'EntryP'의 'P'는 '포인터'를 강조하기위한 것이지만, 여전히 'Entry *'는 모호하다. 어쨌든, 당신의 줄'struct entry * firstentry'는'struct _entry * firstentry'이어야한다고 생각합니다. 밑줄을주의하십시오. – SiegeX
불투명 한 유형을 생성 할 때 숨기는 정보의 한 형태입니다. 약간 더 긴 대답은 this SO link을 참조하십시오.
나는 C에서이 일을 좋아한다 : 이것처럼
// in a "public" header file
typedef struct Example Example;
// in a "private" header or a source file
struct Example { ... };
, 내가 불투명 한 유형으로 Example
을 가지고있는 대한 제외하고는 내 코드, 을 통해 (즉, 난 단지 그것에 대해 포인터를 전달할 수 있습니다) 코드가 실제로 정의 된 것을 볼 수있는 연산을 구현하는 코드. (당신은 불투명 한 타입에 대해 별도의 이름을 사용할 수는 있지만 실질적인 이점은 없습니다.)
C에서 타입이 정의되지 않은 구조체 이름은 유형 이름이 사용되는 모든 곳에 prepend 될 "struct"가 필요하므로 대부분의 사람들이 사용합니다 typedef를 사용하여 항상 앞에 붙은 struct 키워드가 필요없는 유형의 새 이름을 만듭니다.
이렇게하는 이유는 코드 가독성, 감소 된 타이핑 및 명확성 때문일 수 있지만 typedef는 실제로 포인터 유형에 대한 정보를 가릴 수 있습니다.
structs에 대한 새로운 이름을 만들기 위해 typedef를 사용해야한다는 것은 유물이며 C99가 C++의 단서를 따라 제거하지 못하는 것은 수치스러운 일입니다.
C99는 역순으로'struct'를 없애기 위해'typedef '를 제거 할 수 없습니다. 적합성. 'struct Foo {...};와 같은 많은 코드가 있습니다. typedef ... Foo;'컴파일을 중단합니다. – JeremyP
C 언어에서는 홀수 쿼크이고 구조 태그 이름은 다른 네임 스페이스 (기호 테이블)에 저장됩니다. C++ 언어는이 동작을 제거했습니다. typedef는 전역 이름 공간에서 구조 유형에 대한 별칭을 만듭니다. 따라서 구조체 이름 앞에 "struct"를 입력 할 필요가 없습니다.
그가이 행동을 정의했을 때 Ritchie가 무엇을 흡연했는지 확실하지 않습니다. 필자는 초기 버전의 컴파일러에서 파서에 대한 문제를 추측하고 있습니다.
모든 컴파일러가 128k 이하의 데이터 공간에 적합해야 할 때 중요했던 첫 번째 컴파일러에서 메모리 할당이 간소화되었다고 생각합니다. 사실, 가장 초기의 C 컴파일러에는 구조체 멤버 이름을위한 단일 전역 * 네임 스페이스가있었습니다. 이것은'struct foo'와'struct bar'는 둘 다'x'라는 멤버를 가질 수 없다는 것을 의미합니다.이 멤버는이 날에 공통적 인 구조체 멤버를위한 태그 스타일 ('f_x','b_x')을 직접적으로 이끌었습니다 C 코드. –
@ 데이브 : 네가 맞다고 생각해. 구조 멤버 이름으로 무엇인가가 흡연 중입니다. 너무 오래되었습니다, 나는 그 뇌 세포를 오래 전에 무시한 구석에 두었습니다. 왜 와야 했어? 비? –
단지 코드 가독성을위한 것입니다. typedef는 데이터 유형에 대한 새로운 이름을 제공하기위한 것입니다. 대신에 원하는 곳으로 이름을 붙일 수있는 모든 곳에 int를 부여하는 대신 int를 사용하는 곳 어디에서나 당신이 지정한 새로운 이름으로 바꿀 수 있습니다. 구조체에도 똑같은 것이 적용됩니다.
실제로 구조체에는 typedef를 사용하지 않습니다. 왜? 나는 어떤 종류의 변수를 쉽게 볼 수 있도록 어쨌든 접두사 인 s_
이라는 접두사를 사용하기 때문에.
추상적 인 데이터 유형이 많기 때문에 typedef를 사용하는 것이 좋을 것입니다. 따라서 사용자가 실제로 불투명 한 유형으로 사용합니다. 하지만 실제로는 구현에서 항상 구조체를 사용합니다.
그의 저서 * Expert C Programming *에서 Peter van der Linden은 구조체의 typedef가 쓸모가없고 귀찮게하지 말아야한다고 주장합니다. 나는 이것을 좋아한다. 모든 typedef는 declaratations와 prototypes와 같은 몇개의 장소에'struct'라고 쓰는 것을 절약 해줍니다. 난독화할만한 가치가 없습니다. '->'또는'.'을 사용해야 할 때를 즉시 알고 싶습니다. typedef는 이것을 더 어렵게 만듭니다. – Jens