2017-11-29 2 views
2

C에서 구조체를 정의한다고 가정 해 보겠습니다. 구조체의 인스턴스를 선언하면 앞에 'struct'키워드를 포함시켜야합니다.C에서 'struct'키워드 앞에 struct 인스턴스가 있어야하는 이유는 무엇입니까?

// Define struct 
struct Book { 
    char title[50]; 
    char author[50]; 
    char subject[100]; 
    int book_id; 
}; 

// Instantiate struct 
int main() 
{ 
    struct Book myBook; 
} 

내 질문 : 구조체의 인스턴스화 앞에 struct 키워드가 필요한 이유는 무엇입니까? 컴파일러가 'Book'이 구조체라는 점을 감추는 많은 정보가있는 것처럼 보입니다.

나는이 문제를 typedef를 사용하여 해결할 수 있다는 것을 알고 있지만 실제로 컴파일러가 알아야 할 보일러 플레이트 코드처럼 보인다.

+5

C에서 구조체와 공용체는 전역 네임 스페이스와 다른 고유 한 네임 스페이스를가집니다. 구조체 네임 스페이스를 볼 수 있도록'struct'라고 말해야합니다. –

+1

@RaymondChen : 태그 네임 스페이스는 구조체, 공용체 및 열거 형에서 공유됩니다. 예를 들어 동일한 범위에'struct foo'와'union foo'를 둘 다 가질 수는 없습니다. 레이블은'struct'와'union' 멤버처럼 자신의 네임 스페이스를 갖습니다. 다른 모든 식별자 (변수 이름, 함수 이름, 열거 상수 등)는 "일반 식별자"네임 스페이스로 묶입니다. –

답변

0

키워드로 struct, union 및 enum 이름을 사용하면 다른 엔터티의 이름과 충돌하지 않는 고유 한 네임 스페이스를 구성 할 수 있습니다. 현재 배치에 예를

#include <stdio.h> 

int main(void) 
{ 
    struct Book 
    { 
     const char *Book; 
    } Book = { "The first favorite book" }; 

    struct Book otherBook = { .Book = "The second favorite book" }; 

    puts(Book.Book); 
    puts(otherBook.Book); 

    return 0; 
} 
+0

이것이 항상'struct'를 작성하는 성가심을 상쇄하기에 충분히 심각한 것인지 (또는 디버깅 정보를 역사적으로 혼동시키는'typedef '트릭을 사용하여) 판단하는 것이 독자에게 맡겨져 있습니다. –

+0

@MatteoItalia 문제는 다른 모듈이나 라이브러리의 이름과 충돌 할 수 있다는 것입니다. 키워드를 사용하면 이러한 충돌을 피할 수 있습니다. –

+0

실제로는 ... 형식을 별도의 네임 스페이스로 유지합니다.이 네임 스페이스는 모든 포함 된 라이브러리간에 여전히 공유되므로 유형과 다른 종류의 심볼간에 충돌이 발생할 경우에만 도움이됩니다. 충돌하는 함수 이름 (일반적으로 발생하는)이있는 경우 문제가있는 것과 같습니다. –

0

를 들어

, 당신은 모두 struct Bookstruct Book 관련이있을 필요가 없습니다 Book라는 글로벌/로컬 기호,있을 수 있었다. struct stat이라는 함수가 stat과 함께 존재하면 POSIX에서이 기능을 사용하는 좋은 예가됩니다.

분명히, C++ 완료 (하여 같은 범위에서 아마 Book 관련이없는 및 struct Book이 예상을 잃게) 것처럼 당신은 typedefing을 자동화 할 수 있습니다,하지만 난 자동화되지는 아마도 깔끔한 문법을하게 추측 다음 때문에 typedef을 전혀 사용하지 않으면 기본적으로 컨텍스트가없는 문법을 사용하는 반면 typedef (명시 적 또는 암시 적)에서는 현재 유효한 typedef 유형의 컨텍스트를 파서가 유지 관리해야합니다.


개인적으로는 같은 이름의 구조체 태그 전역 범위의 공존이 예상에 보내고 typedef 자동화 선호하고, 그래서 수행

#define Struct(Nm,...) typedef struct Nm Nm; struct Nm __VA_ARGS__ 
#define Union(Nm,...) typedef union Nm Nm; union Nm __VA_ARGS__ 
#define Enum(Nm,...) enum Nm __VA_ARGS__; typedef enum Nm Nm 

Struct(Book,{ 
    char title[50]; 
    char author[50]; 
    char subject[100]; 
    int book_id; 
}); 

(당신은 사용할 수 있습니다 구조체/공용체/열거 형 (예 : _s, book_s과 같이)을 처리한다는 것을 알 수있는 명명 규칙과 함께 사용합니다.

관련 문제