# 39, & # 39 struct& 차이. # 39, & # 39 및 메리 페데프 struct&. c++에서?

C++에서, 유지됩니까 차이:

struct Foo { ... };

typedef struct { ... } Foo;
질문에 대한 의견 (2)
해결책

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' 에 정의된 것과 태그번호 이름공간이 불과하다.

39, d 가 you& 선언할 수 있다.

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

해설 (16)

[이 데이 문서] [1] 에 대해, 댄 또한 하나의 작은 영역을 통해 크립 수 없는 경우 해당 버그를 메리 페데프 구조체 (및 클래스뿐만!).

&gt. 스케쳐내 c++컴파일러는 상상을 할 수 있습니다 &gt. 모든 태그를 위한 메리 페데프 생성합니다. &gt. 이름 (예: &gt. &gt. 메리 페데프 클래스용 구체화하십시오 구체화하십시오. &gt. &gt. 죄송합니다. 완전히 아니다 &gt. 정확한. I wish that simple, 마치 &gt. 하지만, s, t # 39 등 can& c++컴파일러는 it& # 39 생성할 수 없습니다. &gt. 구조체, 노동조합, 또는 이넘 대한 메리 페데프스 &gt. 비호환성 도입합니까 없이 &gt. c 로 &gt. &gt. 예를 들어 C 프로그램 &gt. 모두 다 기능과 구조체입니다 &gt. release. 상태: &gt. &gt. int 상태 (); 구조체입니다 상태. &gt. &gt. 하지만 다시 나쁜 것이 아닐 수 있음 &gt. 이는 C. 이 프로그램 상태 (대표 &gt. 자체가) 는 함수, 구조체입니다 &gt. 상태) 은 유형:. &gt. &gt. 한 경우 자동으로 생성하는 c++컴파일러는 &gt. 태그에 대한 메리 페데프스 때 단순화표현, &gt. 이 프로그램으로, 이 c++컴파일러는 컴파일됨 &gt. 컴파일러와의 생성할 수 있을 것 "이라고 말했다. &gt. &gt. 메리 페데프 구조체입니다 상태 상태. &gt. &gt. 이 유형은 아니하였으매 죄송합니다. 이름 &gt. 함수 이름 및 갈등을 &gt. 이 프로그램은 컴파일하십시오 않을 것이라고 말했다. # 39 의 that& &gt. # 39, t 앨리어스가 can& 왜 c++컴파일러는 생성합니다. &gt. 각 태그이고, 메리 페데프 &gt. &gt. C++에서, 메리 페데프 마찬가지로 주기표시 act) &gt. 단, 프로그램 이름을 수 있습니다. &gt. 객체, 함수 또는 선언하는 &gt. 같은 이름과 함께 열거자를 &gt. 동일한 유효범위 태그로. 이 경우, &gt. 객체, 함수 또는 열거자를 이름 &gt. 감춰집니다 태그 이름을. 이 프로그램은 &gt. 이름만 태그를 사용하여) 은 다음과 같은 뜻이 있다. &gt. 키워드는 클래스를 구조체입니다, 결합 또는 &gt. 이넘 앞에서 (해당하는) &gt. 태그 이름. 이름 구성된 문자 &gt. one of these 여러_키워드 뒤에 &gt. 태그 백업이었습니다 전편에 이어 지정자와 유형. &gt. 예를 들어, 구조체입니다 상태 및 이넘 &gt. 달 전편에 이어 형식 지정자를 있다. &gt. &gt. 따라서 C 프로그램은 모두 포함된: &gt. &gt. int 상태 (); 구조체입니다 상태. &gt. &gt. 동작을 따라 c++컴파일러는 컴파일됨 때도 마찬가지다. &gt. 혼자 이름을 상태를 나타냅니다. &gt. 함수. 이 프로그램 () 는 다음과 같은 뜻이 있다 &gt. 미디어만을 유형을 사용하여 &gt. 전편에 이어 지정자와 유형 구조체입니다 &gt. 상태. &gt. &gt. 이 경우 어떻게 할 수 있어 크립 버그 &gt. 프로그램으로? 프로그램을 포지셔닝합니다 &gt. [열거합니다 1] [2]. 이 프로그램은 정의합니다. &gt. foo 함께 기본 생성자는 클래스, &gt. 그리고 있는 변환 연산자 &gt. const * foo 객체를 챨 변환합니다. &gt. 표현식에서는 &gt. &gt. p = 푸 (); &gt. &gt. foo 객체에는 chunghwa a main 한다. &gt. 변환 연산자를 적용한다. 이 &gt. 이후 출력입니다 기술서임을 &gt. &gt. 코트 &lt <; p &lt <; # 39, & # 39 \n&;; &gt. &gt. 하지만 나타나야 하는 클래스용 푸 &gt. # 39, doesn& 없다. Foo 함수은 표시됩니다. &gt. &gt. 이 놀라운 결과 때문입니다 &gt. 이 프로그램은 dm_ownerdm_owner 헤더입니다 리발트 &gt. [열거합니다 2] [3] 과 같이. 이 헤더입니다 &gt. eventtest 라는 기능도 foo. 이 &gt. 클래스 이름을 감춰집니다 함수 이름 푸 &gt. foo 때문에 참조입니다 foo 의 주 &gt. 이 함수가 아닌) 로 구분된다. &gt. 클래스 만 주 () 는 다음과 같은 뜻이 있다 &gt. 전편에 이어 지정자와 유형 사용하는 것처럼, &gt. 에서 &gt. &gt. p = 클래스용 푸 (); &gt. &gt. 이러한 혼동을 피하기 위해 운행에서어떠한 &gt. 이 프로그램 전체에 추가할 수 있다. &gt. 다음과 같은 클래스 이름을 위한 메리 페데프 &gt. foo. &gt. &gt. 메리 페데프 클래스용 foo foo. &gt. &gt. 바로 이전 또는 이후에 클래스 &gt. 를 정의할 수 있다. 이 경우 메리 페데프 &gt. 갈등 및 유형 이름 푸 &gt. 함수 이름 foo (&solarisdvd &gt. 트리거할 라이브러리) &gt. 컴파일 타임 오류:. &gt. &gt. 실제로 내가 아는 사람이 없는 쓰기뿐만 &gt. 이러한 메리 페데프스 as a matter of 물론이겠지. &gt. 많이 필요합니다 있기 때문입니다. 이후 &gt. 이 같은 근접 오류 &gt. [열거합니다 1] [4] 는 아마 예쁜 한 &gt. 결코 작은 전날에약혼자에게 많은 충돌한다 실행하십시오 있다. &gt. 이 문제가 발생합니다. 네 신앙이니라 오류로 &gt. 소프트웨어 신체에 상처가 될 수도 있다. &gt. 아니 그럼 메리 페데프스 기록하십시오 합니다. &gt. 가능성은 얼마나 어려운지 상관없이 오류가 발생합니다. &gt. &gt. 내가 왜 판매업체에서 아니하였으매 can& t # 39, 누구나 상상해 보십시오. &gt. 클래스 이름을 숨기고 싶은 수신기마다 &gt. 함수 또는 천체명 같은 &gt. 유효범위 다음과 같이 구분된다. 숨어 있는 규칙 &gt. c 에서 pokemonsilver. 실수를 한다 &gt. 연장되었습니다 클래스에 없습니다. &gt. C++. 그러나 이 문제를 해결할 수 있습니다 &gt. 하지만 추가 실수를 합니다. &gt. 그런 노력을 감시와 프로그래밍 &gt. 할 필요가 없습니다.

[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

해설 (3)

한 번 더 중요한 차이점: '메리 페데프 의 就不可能拥有 전달하십시오 선언했다. 그래서 '' 옵션을 위한 메리 페데프 합니다 ',' 모든 것이 포함된 파일 # include '' 선생님 '도' 즉 '메리 페데프 .h 파일을 직접 필요로 할 수 있는 # include dm_ownerdm_owner 인스턴스인지 방관하겠나 및 드릴링됩니다. 시간은 구축하십시오 큰 프로젝트에 미치는 영향은 말해둘꼐요 수 있습니다.

메리 페데프 없이 ',' 선언 'Foo 구조체입니다 앞 추가하기만 경우도 있습니다.' 의 '만' 의 '파일이므로 상단에 .h 에' 정의 '' # include 구조체입니다 지크프 절실해졌습니다.

해설 (4)

, 는 미묘한 차이가 있을 수 있지만. 이것좀봐 this way. '구조체입니다 Foo' 는 새 유형:. 두 번째 앨리어스를 창출합니다 아닌 새로운 유형) 에 Foo 라는 익명의 '구조체입니다' 유형:.

&gt. 는 메리 페데프 지정자와 7.1.3

&gt. 1 [.]

&gt. 이름을 선언되는 메서드입니다 메리 페데프 지정자와 메리 페데프 이름 됩니다. 그 범위 내에서 한 것이다. 이 같은) 의 이름과 관련된 키워드를 메리 페데프 이름 구조상 식별자입니다 유형 운행에서어떠한 8 조 참조). 따라서 a 는 다른 유형의 메리 페데프 이름 한다. 방식으로 한 것은 새 type 메리 페데프 이름 does 소개하십시오 클래스 선언에 (9.1) 또는 enum 선언 높여줍니까.

&gt. 8 클래스 이름 없는 경우 (또는 enum), 첫 번째 메리 페데프 이름 eventtest 메리 페데프 선언에 의해 공표된 선언 해당 클래스를 나타내는 데 사용할 수 있는 유형 (또는 enum 타입) 클래스 유형 (또는 enum 타입) 의 연결 오직 (3.5). [예:

typedef struct { } *ps, S; // S is the class name for linkage purposes

그래서 항상 메리 페데프 사용되는 다른 유형의 표시됨과 자리표시자 / 한다.

해설 (0)

39 를 사용하여 너회가 can& 전달하십시오 선언, t 메리 페데프 구조체입니다.

익명의 이 구조체입니다 자체가 없는 실제 이름, 유형, 그러니까 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
해설 (6)

구조체입니다 만드는 것이 데이터 유형. 이 별명은 데이터 유형을 위한 메리 페데프 설정할 수 있다.

해설 (1)

39, & # 39 메리 페데프 struct& 중요한 차이점은. # 39, & # 39 과 struct&. # 39, & # 39 의 초기화 메리 페데프 structs& 에로남이네 인라인 c++에서 멤버. 작동하지 않습니다.

// 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; };
해설 (2)

하지만 난 차이가 없을 것이라고 믿고 c++컴파일러는 인스턴스를 하는 수 없이 Foo 구조체입니다 명시적으로 너희가운데 C:

struct Foo bar;
해설 (1)