programing

X타입에프(struct X typedef) vs.X형 구조체?

prostudy 2022. 5. 25. 22:17
반응형

X타입에프(struct X typedef) vs.X형 구조체?

기존 코드 베이스에는 다음과 같은 (작동) 코드가 있으며, MSVC(2010)와 Windows DDK에서 컴파일된 C와 C++ 사이에 공유되는 포함 파일에 사용된다.

struct X {
    USHORT x;
} typedef X, *PX;

그리고:

enum MY_ENUM {
    enum_item_1,
    enum_item_2 
} typedef MY_ENUM;

내가 알기로는 정확한 정의는 다음과 같이 보여야 한다.

typedef struct {
    USHORT x;
} X, *PX;

아래 양식을 가지고 있는 목적이 있는가?내가 뭘 빼놓았나요?

둘 다라는 사실은typedef <type> <alias>, 그리고<type> typedef <alias>타당하다는 것은 단순히 언어 문법 정의에서 나온 것이다.

typedef스토리지 클래스 지정자로 분류됨(예:staticauto), 유형 자체를 유형 지정자로 한다.표준 섹션 6.7의 구문 정의에서 다음 구문을 자유롭게 상호 교환할 수 있음을 알 수 있다.

declaration:
    declaration-specifiers init-declarator-list ;

declaration-specifiers:
    storage-class-specifier declaration-specifiers
    type-specifier declaration-specifiers
    type-qualifier declaration-specifiers
    function-specifier declaration-specifiers

init-declarator-list:
    init-declarator
    init-declarator-list , init-declarator

init-declarator:
    declarator
    declarator = initializer

(물론 이것은 구조체와 비구조물에 대해서도 똑같이 사실이며, 이는 다음을 의미한다.double typedef trouble;또한 유효하다.)

남들이 말했듯이.typedef스토리지 클래스 지정자이며, 다른 스토리지 클래스 지정자와 마찬가지로 유형과 선언자 사이에 지정자를 넣을 수 있다.

이는 유효하지만 C가 이를 흐릿하게 특징으로 표시했기 때문에 피해야 하는 형식이기도 하다.

(C11, 6.11.5p1) "선언서 지정자의 시작 부분 이외의 보관 등급 지정자를 선언문에 배치하는 것은 구태의연한 특징"

둘 다 뜻이 같다.이 두 가지 양식은 모두 유효하다.

typedef <existing_type> <new_type>
<existing_type> typedef <new_type>   

넌 할 수 있다.typedef위의 구조는 두 가지 방법 모두:

struct X {
    USHORT x;
}typedef X, *PX;     // <existing_type> typedef <new_type> 

또는

typedef struct {
    USHORT x;
} X, *PX;            // typedef <existing_type> <new_type>

당신은 정말로 당신이 원하는 어떤 순서로든 모든 선언 명세서를 넣을 수 있다!어떤 포지션의 위치*포인터와 실제 선언기(변수 또는 새 유형 이름)는 문제가 되지만, 그 모든 것은typedef int unsigned const static물건의 순서는 어떠한 것이든 될 수 있다.

C의 공식 문법을 보면 다음과 같이 되어 있다.

declaration:
    declaration-specifiers init-declarator-list ;

declaration-specifiers모든 스토리지 클래스 지정자(typedefextern, 등), 유형 지정자(실제 유형, 예를 들어int또는struct X)), 형식 한정자(const, 그리고volatile(), 그리고 몇 가지 덜 일반적인 것.그들의 질서는 중요하지 않다.두 번째 부분은.init-declarator-list의 , 수 수 있는 것은 새 유형 이이이다.*문자, 수표)int x = 3 () 선언자 선언자 부분의 사물의 순서는 중요하지만 선언 지정자의 순서는 아니다.

고지 사항:이것은 기술적인 대답이 아니라 실제적인 대답이다.기술적인 문제는 다른 답변을 참조하십시오.이 답은 주관적이고 의견이 분분하지만 내가 더 큰 그림을 설명하려고 노력하는 동안 참고 있어줘.

struct이상한 짐승이야. 왜냐하면 닫는 괄호 사이에 놓았던 물건들이}그리고 세미콜론;괄호 안의 내용 또는 앞의 내용.나는 그것이 왜 그런지 알고 있고 문법적으로는 말이 되지만, 개인적으로 나는 그것이 보통 곱슬곱슬한 괄호가 범위를 의미하기 때문에 매우 직관에 반한다는 것을 안다.

직관에 반하는 예:

// declares a variable named `foo` of unnamed struct type.
struct {
    int x, y;
} foo;

foo.x = 1;


// declares a type named `Foo` of unnamed struct type
struct {
    int x, y;
} typedef Foo;

Foo foo2;
foo2.x = 2;


// declares a type named `Baz` of the struct named `Bar`
struct Bar {
    int x, y;
} typedef Baz;

// note the 'struct' keyword to actually use the type 'Bar'
struct Bar bar;
bar.x = 3;
Baz baz;
baz.x = 4;

밀도가 높은 구문에는 자칫 잘못될 수 있는 미묘한 것들이 너무나 많다.structs와typedefs 이렇게 쓰면.아래 나온 것처럼 우연에 의한 유형 대신 변수를 선언하는 것은 매우 쉽다.컴파일러는 거의 모든 조합이 문법적으로 정확하기 때문에 도움이 제한적일 뿐이다.그것들은 당신이 표현하고자 하는 것을 반드시 의미하지는 않는다.절망의 구덩이다.

잘못된 예:

// mixed up variable and type declaration
struct foo {
    int x, y;
} Foo;

// declares a type 'foo' instead of a variable
typedef struct Foo {
    int x, y;
} foo;

// useless typedef but compiles fine
typedef struct Foo {
    int x, y;
};

// compiler error
typedef Foo struct {
    int x, y;
};

가독성과 유지보수를 이유로 나는 모든 것을 따로 선언하고 닫히는 곱슬곱슬한 괄호 뒤에 어떤 것도 두지 않는 것을 선호한다.코드 라인의 추가 비용은 직관적인 구문에 의해 쉽게 능가된다.나는 이 접근방식이 올바른 일을 쉽게 하고 잘못된 일을 하는 을 귀찮게 만든다고 주장한다.

직관적인 예:

// declares a struct named 'TVector2'
struct TVector2 {
    float x, y;
};

// declares a type named 'Vector2' to get rid of the 'struct' keyword
// note that I really never use 'TVector2' afterwards
typedef struct TVector2 Vector2;

Vector2 v, w;
v.x = 0;
v.y = 1;

참조URL: https://stackoverflow.com/questions/24227816/what-is-the-meaning-of-struct-x-typedef-vs-typedef-struct-x

반응형