2015-01-10 7 views
1

내가 책과 같이 "학습 코어 오디오"에서 작업 한 몇 가지 예제 코드를 .. Theres는이 C 코드에서 구조체에 대해 두 가지 이름이있는 이유는 무엇입니까?

typedef struct MySineWavePlayer 
{ 
    AudioUnit outputUnit; 
    double startingFrameCount; 
} MySineWavePlayer; 

왜이 코드에서 "MySineWavePlayer는"두 배? 당신은 당신이 구조체의 인스턴스를 선언 같은 것을 할 필요가 다음이

struct MySineWavePlayer 
{ 
    AudioUnit outputUnit; 
    double startingFrameCount; 
}; 

를 작성하는 경우

+0

참조 HTTP : 당신이 구조체 키워드를 포함하여 후퇴해야한다 유형의 인수를 정의 : //stackoverflow.com/questions/15462475/typedef-struct-usage 또는 http://stackoverflow.com/questions/1110944/c-typedef-and-struct-question – Rob

답변

3

첫 번째가 실제로이 경우에는 필요하지 않습니다가, 두 번째는 typedef입니다

struct MySineWavePlayer mySineWavePlayer; 

그런 다음이

typedef struct MySineWavePlayer MySineWavePlayer; 

다음 자명 한 일 입니을 수행 할 수 있습니다 aration는

MySineWavePlayer mySineWavePlayer; 

그래서 원래

typedef struct MySineWavePlayer 
{ 
    AudioUnit outputUnit; 
    double startingFrameCount; 
} MySineWavePlayer; 

이 경우 조합이 될 것입니다.

그리고 당신은 심지어 익명 구조체

typedef struct 
{ 
    AudioUnit outputUnit; 
    double startingFrameCount; 
} MySineWavePlayer; 

그래서 짧은 대답에 대한 typedef을 할 수있는 두 번째는 typedef D 타입의 이름 인 반면 MySineWavePlayerstruct의 이름입니다 처음이다.

+0

기술적으로는 두 가지 중 첫 번째가 필요합니다. 익명 구조체를 선언합니다. 'struct S myStruct'를 수동으로 코딩하고 싶다면, 더 이상 그렇게 할 수 없습니다. – DevNull

+0

사실,'struct s myS; '를 코딩하고 싶다면'typedef'를 할 필요가 없습니다. 그렇다면'typedef'가 필요 없습니다. –

+0

그렇습니다. 그렇지만 그것은 코더의 한 가지 능력을 바꿀 것입니다. 필요한 실제 예제는 몇 년 전의 C89 예전의 예입니다. 몇 년 전에이 예제에서는 typedef'ed struct definition을 좋아하지 않았습니다. – DevNull

10

이것은 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

+0

누가'C++'에 대해 묻고 있습니까? –

+0

@iharob 무엇 C++? C++ 스타일 주석을 제외하고 이것은 곧은 C - oops는 C++ 미묘함을 설명하는 두 번째 절반을 보았다. 전혀 신경 쓰지 마라 –

+0

@ArlieStephens 만약 이것이 C++라면, C++에서는'typedef'가 필요 없기 때문에 전체적인 질문을하지 않을 것이다. –

관련 문제