programing

typedef 구조 vs 구조 정의

goodsources 2022. 8. 18. 00:00
반응형

typedef 구조 vs 구조 정의

인데 C프로그래밍을 사용하는 것과 가 있는지 .typedef를 와 사용하지 경우typedef같은 목표를 달성한 것 같아서 전혀 차이가 전혀 없는 것 같아요.

struct myStruct{
    int one;
    int two;
};

대.

typedef struct{
    int one;
    int two;
}myStruct;

일반적인 관용구는 다음 두 가지를 모두 사용합니다.

typedef struct S { 
    int x; 
} S;

서로 다른 정의입니다.논의를 보다 명확하게 하기 위해 다음 문장을 분할합니다.

struct S { 
    int x; 
};

typedef struct S S;

합니다.S(C++의 의미가 아닌) 구조 이름 공간 내에 있습니다.을 "Drught"로를 정의할 수 .struct S:

void f( struct S argument ); // struct is required here

에는 에일리어스가 .S글로벌 네임스페이스에서 다음과 같이 쓸 수 있습니다.

void f( S argument ); // struct keyword no longer needed

때문에 .S동일한 식별자를 재정의하는 것이 아니라 다른 위치에 다른 식별자를 생성하는 것이기 때문에 구조물과 전역 공간 모두 오류가 아닙니다.

차이를 명확히 하기 위해:

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++는 2개의 다른 식별자 공간을 유지하고 있지만 C와는 달리 클래스 ID 공간 내에서만 기호를 정의할 경우 structure/class 키워드를 지정할 필요가 없습니다.

 // C++
struct S { 
    int x; 
}; // S defined as a class

void f( S a ); // correct: struct is optional

변경사항은 ID가 정의된 위치가 아닌 검색 규칙입니다.과 그 후에 합니다.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되는 것은 하거나 해당 '컴파일러'를 .개체를 작성하거나 해당 유형의 인수를 정의하려면 다음 명령을 포함해야 합니다.struct★★★★★★★★★★★★★★★★★★:

// previous code here...
int main() {
    S(); 
    struct S s;
}

struct ★★★★★★★★★★★★★★★★★」typedef혀른른하다

struct키워드는 구조체의 유형을 정의하거나 참조하기 위해 사용합니다.예를 들어 다음과 같습니다.

struct foo {
    int n;
};

는 새로운 .struct foo ★★foo태그입니다.그것이 의미가 있는 것은, 이 태그가 바로 앞에 있는 경우 뿐입니다.struct키워드를 지정합니다.태그 및 기타 식별자는 개별 네임스페이스에 있기 때문입니다.(이는 C++의 개념과 비슷하지만 훨씬 더 제한적입니다.namespaces).

A typedef는 이름에 관계없이 새로운 유형을 정의하지 않고 기존 유형의 새 이름을 만들 뿐입니다.예를 들어 다음과 같습니다.

typedef int my_int;

my_int는 is is is is is is is is is for for 。intmy_int ★★★★★★★★★★★★★★★★★」int정확히 같은 유형입니다.마찬가지로,struct위의 정의는 다음과 같습니다.

typedef struct foo foo;

활자에는 이름이 있습니다.struct foo . 。typedef은 같은 에 새로운 declaration을 합니다.foo.

하면 '어울리다'를 할 수 .struct ★★★★★★★★★★★★★★★★★」typedef단일 선언으로 변환합니다.

typedef struct bar {
    int n;
} bar;

이치노 이 을 '아까보다'라고 됩니다.struct bar 그냥 ★★★★★★★★★★★★★★★.bar.

typedef를 사용하다되어 있는 는, 「」를 사용해 .struct다음 중 하나:

typedef struct node {
    int data;
    struct node *next; /* can't use just "node *next" here */
} node;

일부 프로그래머는 구조 태그와 typedef 이름에 고유한 식별자를 사용합니다.제 생각에는 그럴 만한 이유가 없습니다. 같은 이름을 사용하는 것은 완전히 합법적이고 같은 유형이라는 것을 명확히 하기 때문입니다.다른 식별자를 사용해야 하는 경우 최소한 일관된 규칙을 사용하십시오.

typedef struct node_s {
    /* ... */
} node;

으로는 (이렇게 하다)는이 좋습니다typedef '형'을 '형'이라고 .struct bar . 。typedef타이핑은 조금 덜지만 구조형이라는 사실은 숨깁니다.불투명한 타입을 원하는 경우는, 이것이 좋은 방법입니다. n이름만 들어도 불투명하지 않고 눈에 띄게 구조입니다. 제 생각에는 구조라고 하는 것이 타당합니다.하지만 많은 똑똑한 프로그래머들은 이 점에 대해 저와 의견이 다릅니다.어느 쪽이든 코드를 읽고 이해할 수 있도록 준비하십시오.)

(C++로 하다)이 있을 .struct blah'그냥', '그냥', '그냥', '그냥', '그냥', '그냥', '그냥', '그냥', '그냥', '그냥', '그냥', '그냥', '그냥', '그냥', '그냥', '그냥'이라고 하면 돼요blahtypedef typed typed typed typed typed typed typed typed typed typedC가 C같은 가 될 수.-typedef는 C++로 되어 있습니다.

「 」를 사용하고 struct 없이typedef 항상

struct mystruct myvar;

글을 쓰는 것은 불법이다.

mystruct myvar;

「 」를하고 있는 는,typedefstruct를 지정합니다

C(C++가 아님)에서는 다음과 같은 구조 변수를 선언해야 합니다.

struct myStruct myVariable;

「 」를 사용할 수 .myStruct myVariable;은 '나' '나' '나' '나'를 할 수 있다.typedef★★★★

typedef struct myStruct someStruct;
someStruct myVariable;

할 수 .struct 및 " " "typedef는 익명의 '어나니머스'를 선언하는 에 포함되어 있습니다.struct ★★★★★★★★★★★★★★★★★」typedef

typedef struct { ... } myStruct;

지적되지 않은 또 다른 차이점은 구조물에 이름(즉, 구조 myStruct)을 지정하면 구조물에 대한 정방향 선언을 제공할 수 있다는 것입니다.다른 파일에서는 다음과 같이 쓸 수 있습니다.

struct myStruct;
void doit(struct myStruct *ptr);

그 정의에 접근할 필요 없이 말이죠.두 가지 예를 조합하는 것이 좋습니다.

typedef struct myStruct{
    int one;
    int two;
} myStruct;

이를 통해 보다 간결한 typedef 이름을 편리하게 사용할 수 있지만 필요한 경우 전체 구조 이름을 사용할 수 있습니다.

은 앞으로 하다와 수 .typedef struct.

struct그 자체가 익명 타입이기 때문에, 전달 신고할 실제의 이름은 없습니다.

typedef struct{
    int one;
    int two;
} myStruct;

다음과 같은 전향 선언은 작동하지 않습니다.

struct myStruct; //forward declaration fails

void blah(myStruct* pStruct);

//error C2371: 'myStruct' : redefinition; different basic types

을 가진 합니다.myStruct:

typedef struct{
    int one;
    int two;
} myStruct;

구조물의 식별자를 지정하지 않기 때문에 별칭 없이 참조할 수 없습니다.

typedef는 다른 구성 요소와 마찬가지로 데이터 유형에 새 이름을 붙이기 위해 사용됩니다. 대부분 깔끔하게 됩니다.

struct myStruct blah;

대.

myStruct blah;

C에서 구조, 결합 및 열거의 유형 지정자 키워드는 필수입니다. 즉, 항상 유형 이름(태그) 앞에 다음을 붙여야 합니다.struct,union ★★★★★★★★★★★★★★★★★」enum종류와 관련하여.

, , 을 합니다.typedef오브젝트의 실제 타입은 선언 시에 표시되지 않기 때문에 정보가 숨겨져 있는 형식입니다.

따라서 (Linux 커널 코딩 스타일가이드, 제5장 참조) 이 조작은 몇 개의 키 스트로크를 저장하는 것이 아니라 실제로 이 정보를 숨기는 경우에만 실행하는 것이 좋습니다.

「」를 사용할 가 있는 예.typedef해당 액세스 기능/액세서에서만 사용되는 불투명한 유형입니다.

이것에 대해 좀 더 명확히 해야 할 것 같네요.C와 C++는 유형을 다르게 정의하지 않습니다.C++는 원래 C 위에 포함된 추가 세트에 지나지 않았습니다.

오늘날 거의 모든 C/C++ 개발자들이 안고 있는 문제는 a) 대학이 더 이상 기본을 가르치지 않고 b) 정의와 선언의 차이를 사람들이 이해하지 못한다는 것입니다.

이러한 선언과 정의가 존재하는 유일한 이유는 링커가 구조체의 필드에 대한 주소 오프셋을 계산할 수 있기 때문입니다.컴파일러가 어드레싱을 판별할 수 있기 때문에 대부분의 사람들은 실제로 잘못 기술된 코드를 피해가는 것입니다.이 문제는 큐나 링크 목록과 같은 추가 작업을 수행하려고 하거나 O/S 구조를 피깅백하려고 할 때 발생합니다.

선언은 'struct'로 시작하고 정의는 'typedef'로 시작합니다.

또한 구조체는 정방향 선언 라벨과 정의된 라벨을 가진다.대부분의 사용자는 이를 알지 못하고 정방향 선언 레이블을 정의 레이블로 사용합니다.

틀렸다:

struct myStruct
   {
   int field_1;
   ...
   };

그들은 구조에 라벨을 붙이기 위해 순방향 선언을 사용했을 뿐이므로 컴파일러는 이를 인식하고 있지만 실제로 정의된 유형은 아닙니다.컴파일러는 어드레싱을 계산할 수 있지만, 이것은 사용법이 아닙니다.이유는 잠시 설명하겠습니다.

이런 형태의 선언문을 사용하는 사람들은 사실상 모든 언급에 항상 '구조'를 넣어야 한다. 왜냐하면 그것은 공식적인 새로운 유형이 아니기 때문이다.

대신 자신을 참조하지 않는 구조는 다음과 같이 선언하고 정의해야 합니다.

typedef struct
   {
   field_1;
   ...
   }myStruct;

이제 실제 유형으로, 사용 시 '구조'라는 단어 앞에 붙일 필요 없이 'myStruct'로 사용할 수 있습니다.

해당 구조체에 포인터 변수를 지정하려면 다음 보조 레이블을 포함합니다.

typedef struct
   {
   field_1;
   ...
   }myStruct,*myStructP;

이제 해당 구조에 대한 포인터 변수가 커스텀되었습니다.

포워드 선언--

자, 여기 멋진 것들이 있습니다. 어떻게 미래 선언이 이루어지는지 말이죠.링크된 목록이나 큐 요소와 같이 자신을 참조하는 유형을 작성하려면 순방향 선언을 사용해야 합니다.컴파일러는 마지막에 세미콜론에 도달할 때까지 정의된 구조를 고려하지 않기 때문에 그 전에 선언됩니다.

typedef struct myStructElement
   {
   myStructElement*  nextSE;
   field_1;
   ...
   }myStruct;

현재 컴파일러는 전체 유형이 무엇인지 아직 모르지만 앞으로 참조를 사용하여 참조할 수 있다는 것을 알고 있습니다.

구조를 올바르게 선언하고 입력해 주세요.사실 이유가 있어요.

후자의 예에서는 구조체를 사용할 때 struct 키워드를 생략합니다.따라서 코드의 모든 부분에 다음과 같이 쓸 수 있습니다.

myStruct a;

대신

struct myStruct a;

이렇게 하면 타이핑이 절약되고 읽기 쉬울 수 있지만, 이것은 취향의 문제입니다.

는 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.struct.

첫 번째 방법은 다음과 같습니다.

struct myStruct aName;

에서는 키워드를 할 수 .struct.

myStruct aName;

언급URL : https://stackoverflow.com/questions/1675351/typedef-struct-vs-struct-definitions

반응형