C++에서, 유지됩니까 차이:
struct Foo { ... };
및
typedef struct { ... } Foo;
C++에서, 미묘한 차이가 있을 뿐이다. S # 39, C 에서 it& 연기하다 이를 유의해야 합니다.
C 언어 표준 ([C89 & # 167, 3.1.2.3] [1], [C99 & # 167, 6.2.3] [2] 및 [C11 & # 167, 6.2.3] [3]) 에 대한 별도의 규정이 네임스페이스을 등 다양한 범주의 식별자입니다 tag identifiers ("에 대한 '/ /' '노조의 구조체입니다 이넘') 와 ordinary identifiers (" 에 대한 메리 페데프 '및 기타 식별자입니다).
방금 말하였노라 경우
struct Foo { ... };
Foo x;
컴파일러 오류가 얻을 수 있기 때문에 'Foo' 에 정의된 것과 태그번호 이름공간이 불과하다.
struct Foo x;
언제든지 운영까지도 가리키는 'Foo', '이 항상 you& # 39; d' 구조체입니다 Foo) 이라 할 수 있습니다. 이 질문을 되돌려줍니다 귀찮게 파르게 추가할 수 있도록 한 '메리 페데프':
struct Foo { ... };
typedef struct Foo Foo;
이제 '일반' 그냥 '구조체입니다 푸 (flash. 태그번호 이름공간이) 와 Foo' (flash. 일반 식별자입니다 이름공간이) 둘 다 똑같은 유형의 객체로 선언할 수 있다 ',' 구조체입니다 없이 자유롭게 진실이며당신이 Foo '' 키워드.
이 chunghwa:
typedef struct Foo { ... } Foo;
이 선언은 '와' 메리 페데프 약어입니다 뿐입니다.
마지막으로,
typedef struct { ... } Foo;
'하다' 는 익명의 구조 및 메리 페데프 일이다. 따라서, 이 이름을 가지고 있는 chunghwa 대체하십시오 doesn& # 39 만 t, 태그 네임스페이스인 이름을 메리 페데프 이름공간이. 즉, 또한 앞으로 밝혔다. 수 없습니다. 스케쳐내 전달하십시오 선언을 할 수 있는 태그번호 이름공간이 이름을 부여합니다.
C++에서, '/' '/' 클래스 '/' union all '구조체입니다 이넘' 선언 '& # 39, 에드, 이들은' 처럼 행동하는 암시적으로 메리 페데프 deltamove 이름은 같은 이름을 가진 다른 선언에 의해 숨겨진 없습니다. 참조 [# 39 의 마이클 Burr& 오토메이티드] [4] 자세한 정보.
[1]: http://port70.net/ ~ nsz/c/c89/c89-draft.txt [2]: # 6.2.3 nsz/c/c99/n1256.html ~ http://port70.net/ [3]: # 6.2.3 nsz/c/c11/n1570.html ~ http://port70.net/ [4]: # 612476 https://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c/612476
[이 데이 문서] [1] 에 대해, 댄 또한 하나의 작은 영역을 통해 크립 수 없는 경우 해당 버그를 메리 페데프 구조체 (및 클래스뿐만!).
>. 스케쳐내 c++컴파일러는 상상을 할 수 있습니다 >. 모든 태그를 위한 메리 페데프 생성합니다. >. 이름 (예: >. >. 메리 페데프 클래스용 구체화하십시오 구체화하십시오. >. >. 죄송합니다. 완전히 아니다 >. 정확한. I wish that simple, 마치 >. 하지만, s, t # 39 등 can& c++컴파일러는 it& # 39 생성할 수 없습니다. >. 구조체, 노동조합, 또는 이넘 대한 메리 페데프스 >. 비호환성 도입합니까 없이 >. c 로 >. >. 예를 들어 C 프로그램 >. 모두 다 기능과 구조체입니다 >. release. 상태: >. >. int 상태 (); 구조체입니다 상태. >. >. 하지만 다시 나쁜 것이 아닐 수 있음 >. 이는 C. 이 프로그램 상태 (대표 >. 자체가) 는 함수, 구조체입니다 >. 상태) 은 유형:. >. >. 한 경우 자동으로 생성하는 c++컴파일러는 >. 태그에 대한 메리 페데프스 때 단순화표현, >. 이 프로그램으로, 이 c++컴파일러는 컴파일됨 >. 컴파일러와의 생성할 수 있을 것 "이라고 말했다. >. >. 메리 페데프 구조체입니다 상태 상태. >. >. 이 유형은 아니하였으매 죄송합니다. 이름 >. 함수 이름 및 갈등을 >. 이 프로그램은 컴파일하십시오 않을 것이라고 말했다. # 39 의 that& >. # 39, t 앨리어스가 can& 왜 c++컴파일러는 생성합니다. >. 각 태그이고, 메리 페데프 >. >. C++에서, 메리 페데프 마찬가지로 주기표시 act) >. 단, 프로그램 이름을 수 있습니다. >. 객체, 함수 또는 선언하는 >. 같은 이름과 함께 열거자를 >. 동일한 유효범위 태그로. 이 경우, >. 객체, 함수 또는 열거자를 이름 >. 감춰집니다 태그 이름을. 이 프로그램은 >. 이름만 태그를 사용하여) 은 다음과 같은 뜻이 있다. >. 키워드는 클래스를 구조체입니다, 결합 또는 >. 이넘 앞에서 (해당하는) >. 태그 이름. 이름 구성된 문자 >. one of these 여러_키워드 뒤에 >. 태그 백업이었습니다 전편에 이어 지정자와 유형. >. 예를 들어, 구조체입니다 상태 및 이넘 >. 달 전편에 이어 형식 지정자를 있다. >. >. 따라서 C 프로그램은 모두 포함된: >. >. int 상태 (); 구조체입니다 상태. >. >. 동작을 따라 c++컴파일러는 컴파일됨 때도 마찬가지다. >. 혼자 이름을 상태를 나타냅니다. >. 함수. 이 프로그램 () 는 다음과 같은 뜻이 있다 >. 미디어만을 유형을 사용하여 >. 전편에 이어 지정자와 유형 구조체입니다 >. 상태. >. >. 이 경우 어떻게 할 수 있어 크립 버그 >. 프로그램으로? 프로그램을 포지셔닝합니다 >. [열거합니다 1] [2]. 이 프로그램은 정의합니다. >. foo 함께 기본 생성자는 클래스, >. 그리고 있는 변환 연산자 >. const * foo 객체를 챨 변환합니다. >. 표현식에서는 >. >. p = 푸 (); >. >. foo 객체에는 chunghwa a main 한다. >. 변환 연산자를 적용한다. 이 >. 이후 출력입니다 기술서임을 >. >. 코트 < <; p < <; # 39, & # 39 \n&;; >. >. 하지만 나타나야 하는 클래스용 푸 >. # 39, doesn& 없다. Foo 함수은 표시됩니다. >. >. 이 놀라운 결과 때문입니다 >. 이 프로그램은 dm_ownerdm_owner 헤더입니다 리발트 >. [열거합니다 2] [3] 과 같이. 이 헤더입니다 >. eventtest 라는 기능도 foo. 이 >. 클래스 이름을 감춰집니다 함수 이름 푸 >. foo 때문에 참조입니다 foo 의 주 >. 이 함수가 아닌) 로 구분된다. >. 클래스 만 주 () 는 다음과 같은 뜻이 있다 >. 전편에 이어 지정자와 유형 사용하는 것처럼, >. 에서 >. >. p = 클래스용 푸 (); >. >. 이러한 혼동을 피하기 위해 운행에서어떠한 >. 이 프로그램 전체에 추가할 수 있다. >. 다음과 같은 클래스 이름을 위한 메리 페데프 >. foo. >. >. 메리 페데프 클래스용 foo foo. >. >. 바로 이전 또는 이후에 클래스 >. 를 정의할 수 있다. 이 경우 메리 페데프 >. 갈등 및 유형 이름 푸 >. 함수 이름 foo (&solarisdvd >. 트리거할 라이브러리) >. 컴파일 타임 오류:. >. >. 실제로 내가 아는 사람이 없는 쓰기뿐만 >. 이러한 메리 페데프스 as a matter of 물론이겠지. >. 많이 필요합니다 있기 때문입니다. 이후 >. 이 같은 근접 오류 >. [열거합니다 1] [4] 는 아마 예쁜 한 >. 결코 작은 전날에약혼자에게 많은 충돌한다 실행하십시오 있다. >. 이 문제가 발생합니다. 네 신앙이니라 오류로 >. 소프트웨어 신체에 상처가 될 수도 있다. >. 아니 그럼 메리 페데프스 기록하십시오 합니다. >. 가능성은 얼마나 어려운지 상관없이 오류가 발생합니다. >. >. 내가 왜 판매업체에서 아니하였으매 can& t # 39, 누구나 상상해 보십시오. >. 클래스 이름을 숨기고 싶은 수신기마다 >. 함수 또는 천체명 같은 >. 유효범위 다음과 같이 구분된다. 숨어 있는 규칙 >. c 에서 pokemonsilver. 실수를 한다 >. 연장되었습니다 클래스에 없습니다. >. C++. 그러나 이 문제를 해결할 수 있습니다 >. 하지만 추가 실수를 합니다. >. 그런 노력을 감시와 프로그래밍 >. 할 필요가 없습니다.
[1]: http://drdobbs.com/article/print? 아티클레이드 = 18440339 6 [2]: http://drdobbs.com/cpp/184403396? 프뇨 = 1 [3]: (http://drdobbs.com/cpp/184403396) = 2 프뇨? [4]: http://drdobbs.com/cpp/184403396? 프뇨 = 1
한 번 더 중요한 차이점: '메리 페데프 의 就不可能拥有 전달하십시오 선언했다. 그래서 '' 옵션을 위한 메리 페데프 합니다 ',' 모든 것이 포함된 파일 # include '' 선생님 '도' 즉 '메리 페데프 .h 파일을 직접 필요로 할 수 있는 # include dm_ownerdm_owner 인스턴스인지 방관하겠나 및 드릴링됩니다. 시간은 구축하십시오 큰 프로젝트에 미치는 영향은 말해둘꼐요 수 있습니다.
메리 페데프 없이 ',' 선언 'Foo 구조체입니다 앞 추가하기만 경우도 있습니다.' 의 '만' 의 '파일이므로 상단에 .h 에' 정의 '' # include 구조체입니다 지크프 절실해졌습니다.
, 는 미묘한 차이가 있을 수 있지만. 이것좀봐 this way. '구조체입니다 Foo' 는 새 유형:. 두 번째 앨리어스를 창출합니다 아닌 새로운 유형) 에 Foo 라는 익명의 '구조체입니다' 유형:.
>. 는 메리 페데프 지정자와 7.1.3
>. 1 [.]
>. 이름을 선언되는 메서드입니다 메리 페데프 지정자와 메리 페데프 이름 됩니다. 그 범위 내에서 한 것이다. 이 같은) 의 이름과 관련된 키워드를 메리 페데프 이름 구조상 식별자입니다 유형 운행에서어떠한 8 조 참조). 따라서 a 는 다른 유형의 메리 페데프 이름 한다. 방식으로 한 것은 새 type 메리 페데프 이름 does 소개하십시오 클래스 선언에 (9.1) 또는 enum 선언 높여줍니까.
>. 8 클래스 이름 없는 경우 (또는 enum), 첫 번째 메리 페데프 이름 eventtest 메리 페데프 선언에 의해 공표된 선언 해당 클래스를 나타내는 데 사용할 수 있는 유형 (또는 enum 타입) 클래스 유형 (또는 enum 타입) 의 연결 오직 (3.5). [예:
typedef struct { } *ps, S; // S is the class name for linkage purposes
그래서 항상 메리 페데프 사용되는 다른 유형의 표시됨과 자리표시자 / 한다.
익명의 이 구조체입니다 자체가 없는 실제 이름, 유형, 그러니까 don& # 39 포워드하도록 너희가운데.
typedef struct{
int one;
int two;
}myStruct;
앞으로 이 같은 선언을 한 작동합니까 못함.
struct myStruct; //forward declaration fails
void blah(myStruct* pStruct);
//error C2371: 'myStruct' : redefinition; different basic types
// the 'x' in this struct will NOT be initialised to zero
typedef struct { int x = 0; } Foo;
// the 'x' in this struct WILL be initialised to zero
struct Foo { int x = 0; };