2010-04-13 2 views
6
#include <stdio.h> 
#include <string.h> 

const int NAMELEN=30; 

const int MAXCLASSSIZE=10; 

typedef struct StudentRec { 
    char lastname[NAMELEN]; 
    char firstname[NAMELEN]; 
    long int ID; 
    int finalmark; 
}Student; 

저는 코딩에 익숙하지 않습니다. 왜 학생인지에 대한 질문이 있습니다. 브래킷 뒤에 ... 우리가 따라야하는 형식입니까?C/C++ typedefs/structs의 중복 이름 지정

+1

C가 아니라 C입니다. 올바른 언어를 언급하고 있습니까? –

+5

C 또는 C++,이 예제에서는 차이가 없습니다. Google이나 책에서 typedef를 찾으십시오. –

+6

@gbrandt : 그렇습니다. 그러나 C++에서 구조체를 선언 할 이유가 없습니다. –

답변

0

학생은 typedef가 생성 한 새 유형의 이름입니다. StudentRec은 자신이 정의한 구조의 이름입니다.

13

이것은 구조체를 의미하는 "Student"라는 typename을 생성합니다. 이 목적으로 typedef을 사용하는 것은 C++에서는 불필요합니다. 다음과 같이 정의 할 수 있습니다.

struct Student { 
    char lastname[NAMELEN]; 
    char firstname[NAMELEN]; 
    long int ID; 
    int finalmark; 
}; 
+1

대부분의 경우 그것은 불필요하지만 구조체의 정의와 정의를 정의하는 데는 약간의 차이가 있습니다. 식별자는 다른 네임 스페이스에있다 (C++의'namespace' 키워드의 의미가 아니다). http://stackoverflow.com/questions/1675351/typedef-struct-vs-struct-definitions/1675446#1675446 –

17

두 가지를 혼동하게 만듭니다. C에서는이 같은 구조체를 정의 할 수 있습니다 :

struct foo { 
    int a, b; 
}; 

그런 다음 당신이해야 할 하나를 사용 :

struct foo myFoo; 

이 정말 말의, 그래서 그들이 만드는 형식 정의를 사용하는이 기발한 생각을했다 새로운 유형. 사용 후

typedef int myInt; 

과 : 나는 이런 식으로 뭔가를 할 수

myInt x; 

을 그래서 당신이 새로운 유형이 있음을 선언한다하고있는, 구조체에 해당 학생, StudentRec . 규칙에 따라, 많은 사람들이 구조체의 경우와 형식 정의에 같은 이름을 사용 - 그것은 법적이의

typedef struct foo { int a, b; } foo; 
0

없음 C++에 적용되지 않습니다. C++에서 선호 :

struct Foo 
{ 
    . . . 
}; 

나머지는 C에 적용됩니다.

대부분의 경우 기술적으로는 struct Foo {};이면 충분합니다. 그러나 사용하기에 약간 자세한 내용은 Foo가 사용될 때마다 struct을 반복해야합니다.

struct Foo {} 

void func(struct Foo* foo); 

typedef가 더 간단합니다.

typedef struct { } Foo; 
void func(Foo* foo); 

이 익명 struct를 생성하고 제공한다 :

typedef struct Foo { } Foo; 
void func(Foo* foo); 

가 다음 구문을 사용하는 것도 가능 하나 라이너을 수행 할 때 :
struct Foo { }; 
typedef struct Foo Foo; 
void func(Foo* foo); 

더으로 단축 할 수있다 그것은 Foo라는 이름입니다. 이 수치는 enum 초로 자주 표시됩니다.

일반적으로 초기 중복 Foo가 남아있는 이유가 있습니다. 그것은 연결된 목록처럼 자기 참조 구조체를 만드는 유일한 방법 일뿐입니다.

typedef struct Node 
{ 
    Node* next; 
} Node; 

구조체에 대한 포인터를 선언 할 방법이 없습니다 ommited 초기 Node합니다. 기술적으로 이것은 유효하지만, 이제는 단 하나가 아닌 두 개의 이름이 필요합니다.

typedef struct node_ 
{ 
    node_* next; 
} Node; 

왜 사용 : 균일

typedef struct Foo { } Foo; 

. 이 선언 스타일은 모든 기반을 다루므로 구조체를 선언 할 때 생각할 필요가 없습니다.

4

C에서는 구조체 이름과 형식 이름 (예 : int)에 대해 다른 네임 스페이스가 있습니다. 형식 네임 스페이스는 변수 및 함수 네임 스페이스와 공유되므로 유의해야합니다. 새 구조체를 정의 할 때 구조체 네임 스페이스에 이름을 자동으로 추가하지만 해당 형식의 변수를 선언 할 때는 컴파일러가 구조체 네임 스페이스에서 정확히 무엇이 있는지 알 수 있도록 이름 앞에 struct을 붙여야합니다 이 변수를 원한다고

typedef 키워드를 사용하면 선언에 struct 키워드를 사용할 필요가 없도록 변수 이름을 유형 이름 공간에 추가 할 수 있습니다.

예제에서는 typedef 선언을 struct 정의와 결합했지만 형식 네임 스페이스와 구조체 네임 스페이스의 struct에는 다른 이름이 사용되었습니다. 당신은 두 가지 이유로 이것을 할 수 있습니다. 먼저 typedef로 변수 선언과 똑같이 보이는 문 접두사는 이름이 지정된 변수 대신 typename을 정의합니다. 둘째, struct 선언과 세미콜론 뒤에 immediatly 이름을 넣어서 struct 유형의 변수를 선언 할 수 있습니다. 귀하의 예는 이것들을 결합했습니다.

이 다른 법적 형태는 예를 들어 C에 있습니다

/* This declares a variable foo whose type has no name but is a struct that contains one int named x */ 
struct { 
    int x; 
} foo; 

/* This adds bar to the type namespace without adding an entry to the struct namespace. */ 
typedef struct { 
    int y; 
} bar; 

/* This adds the name baz to the struct namespace and declares a variable named b of this type */ 
struct baz { 
    int z; 
} b; 

/* This adds the name ralf to the type namespace which also refers to this type */ 
typedef struct baz ralf; 

C++ 내가 그것을 네임 스페이스 키워드를 가지고 있기 때문에 당신이 눈치 챘을거야 다른 네임 스페이스 구조를 가지고있다. 이 인스턴스에서는 C++이 C보다 단순하지만 struct (또는 class 또는 union 또는 enum)을 정의하면 typedef가 이름을 추가하는 네임 스페이스에 사용 된 이름 (있는 경우)이 자동으로 추가됩니다. 이렇게하면 대부분 단순화되지만 몇 가지 문제가 있습니다. 이것들은 대부분 C와의 하위 호환성을 유지하는 것과 관련이 있습니다. 대부분이 호환성은 누군가 typedefs struct foo foo;인데 이미 사용 된 이름으로 무언가를 명명하려고 할 때의 오류로 간주하지 않는 것과 관련이 있습니다.

또 다른 문제는 매우 일반적인 C 코드의 종류와 함께 제공 :

struct shoe { 
    int size; 
} shoe; 

이 C에서 흔히 특히 구조체의 하나가 필요로 할 때 존재. C에서는 struct shoe의 이름과 변수 shoe의 이름 사이에 충돌이 없기 때문에이 방법이 쉽습니다. C++에서는 여전히 C와의 하위 호환성을 유지하기 위해 작동합니다.