이것은 typedef를 사용하지 않고 struct를 정의 할 때 typedef를 사용하는 것과 다른 점을 설명하는 일반적인 질문입니다.
일반적인 관용구는 모두 사용하고 있습니다 : 그들은 서로 다른 정의입니다 typedef struct X { int x; } X;
. 토론 명확 나는 문장을 분할 할 수 있도록하려면 첫 번째 줄에서
struct S { int x; };
typedef struct S S;
을 당신이 (안 의미 ++은 C) 구조체 이름 공간 내에서 식별자 S
을 정의하고 있습니다. 당신은 그것을 사용하고 struct S
같은 인수의 유형 정의하여 새로 정의 된 유형의 변수 또는 함수 인수를 정의 할 수 있습니다
void f(struct S argument); // struct is required here
두 번째 줄은 글로벌 이름 공간에 유형 별칭 S
을 추가하고, 따라서 당신을 수 있습니다 다만 해주기 모두 식별자 이름 공간 정의 다르기 때문에 구조체 글로벌 공간 모두 S
오류가 아니라고
void f(S argument); // struct keyword no longer needed
주, 그 동일한 식별자를 다시 정의하는 것이 아니라 상이한 식별자를 생성하지 않으므로 다른 장소.식별자가 서로 다른 공간에 보관으로
typedef struct S { int x; } T;
void S() {} // correct
//void T() {} // error: symbol T already defined as an alias to 'struct S'
당신은 구조체의 같은 이름의 함수를 정의 할 수 있지만 같은 이름을 가진 함수를 정의 할 수 없습니다 :
는 차이가 명확하게하려면 typedef가 해당 식별자와 충돌합니다.
C++에서는 기호를 찾기위한 규칙이 미묘하게 변경되어 약간 다릅니다. C++는 여전히 두 개의 서로 다른 식별자 공간을 유지하지만 C는 달리, 때 당신은 단지 클래스 식별자 공간 내에서 기호를 정의, 당신은 구조체/클래스 키워드를 제공 할 필요가 없습니다 :
// C++
struct S { int x; }; // S defined as a class
void f(S a); // correct: struct is optional
어떤 변화가 검색이됩니다 규칙이 아니라 식별자가 정의 된 곳. 컴파일러는 전역 식별자 테이블을 검색하고 S
을 찾지 못하면 클래스 식별자 내에서 S
을 검색합니다.
동일한 방식으로 동작 전에 제시된 번호 :
typedef struct S { int x; } T;
void S() {} // correct [*]
//void T() {} // error: symbol T already defined as an alias to 'struct S'
번째 줄에 S
함수의 정의 후에이 구조체 S는 컴파일러에 의해 자동적으로 해결 될 수 있고, 객체를 만들거나
// previous code here...
int main() {
S();
struct S s;
}
또한
source
참조 HTTP : 당신이 구조체 키워드를 포함하여 후퇴해야한다 유형의 인수를 정의 : //stackoverflow.com/questions/15462475/typedef-struct-usage 또는 http://stackoverflow.com/questions/1110944/c-typedef-and-struct-question – Rob