sourcecode

이 두 구조 선언의 차이점은 무엇입니까?

codebag 2023. 10. 5. 21:34
반응형

이 두 구조 선언의 차이점은 무엇입니까?

저는 다른 튜토리얼의 이 두 구조에 대해 혼란스럽습니다.

typedef struct complex {
    float real;
    float imag;
} COMPLEX;

typedef struct {
    float real;
    float imag;
} COMPLEX;

COMPLEX c1;

요? 왜입니까? 그리고 소문자를 추가할 필요가 있습니까?complex구조 전에? 일반적인 상황이란?

번째 할 수 .COMPLEX아니면struct complex.

에서만 할 수 를 갖게 .COMPLEX.

따라서 C++에서 구조 이름은 유형 이름이며 직접 유형으로 사용할 수 있습니다.

struct complex { ... };
complex c1;
typedef struct complex{
    float  real;
    float imag;
}COMPLEX;

.struct complex된 것입니다COMPLEX. 이제 둘 다 사용할 수 있습니다.struct complex c1;그리고.COMPLEX c1; C를 때 . C++ 에를 하실 수 .complex c1;struct ,typedef피하려면)는 C++에 필요하지 않습니다.

typedef struct {
    float  real;
    float imag;
}COMPLEX;

이것은 이름 없는 구조물로, 입력된 것입니다.COMPLEX. 이제 사용할 수 있습니다.COMPLEX c1;.

지금까지는 이 두 (C) 구성 간의 차이에 대해 설명했습니다.

이 질문 C++에 태그를 지정하면 C++ 헤더의 기능을 사용하는 것이 정확합니다.

std::complex< float > c1;

우선, 다른 사람들이 당신의 질문에 대한 답변에 쓴 것처럼 익명의 구조는 없습니다.COMPLEX라는 별칭을 가진 이름 없는 구조(태그 이름이 없는 구조)가 있습니다.

typedef struct {
    float real;
    float imag;
} COMPLEX;

C++에서 명명되지 않은 클래스/구조라는 용어는 다음과 같이 문서화됩니다(C++ 14 표준, 9 클래스).

클래스 헤드가 클래스 헤드 이름을 생략한 클래스 지정자가 이름 없는 클래스를 정의합니다.

익명 구조라는 개념에 대해서는 C에서 다음과 같이 정의하고 있습니다(6.7.2.1 구조 및 조합 지정자, p.#1).

13 태그가 없는 구조형의 익명조합원을 익명조합이라고 하고 태그가 없는 조합형의 익명조합원을 익명조합이라고 합니다.익명의 구조 또는 조합의 조합원은 포함하는 구조 또는 조합의 조합원으로 간주됩니다.이는 포함하는 구조물 또는 조합도 익명인 경우에 재귀적으로 적용됩니다.

여기 익명 구조의 예가 있습니다.

struct A
{
    struct { int x; int y; };  // <== anonymous structure
    int z;
};

C와 반대되는 C++에는 익명 구조와 같은 개념이 없다는 것을 명심하세요.C++에는 익명조합이라는 개념만 있습니다.

당신의 질문에 관해서는

둘 다 맞습니까? 왜입니까? 그리고 구조화 전에 complex의 소문자를 추가해야 합니까?일반적인 상황이란?

그러면 두 유형의 def 선언이 모두 정확합니다.그리고 정확히 소문자 이름 콤플렉스를 구조 태그로 사용할 필요는 없습니다.구조 태그로 대문자 이름 COMPLEX를 사용할 수도 있습니다.

typedef struct COMPLEX {
    float real;
    float imag;
} COMPLEX;

이 구조물 선언에서

typedef struct {
    float  real;
    float imag;
}COMPLEX;

태그 이름이 없는 구조가 선언되었습니다.다를 할 수 .COMPLEX.

C 구조의 태그 이름에는 다른 이름 공간의 식별자 이름과 충돌하지 않는 고유 이름 공간이 있습니다.

C 표준으로부터 (6.2.3 식별자의 이름 공간)

1 특정 식별자의 선언이 번역 단위의 어느 지점에서나 둘 이상 보일 경우, 구문 컨텍스트는 다른 개체를 나타내는 사용을 모호하게 합니다.따라서 다양한 범주의 식별자에 대해 다음과 같은 별도의 이름 공간이 있습니다.

— 구조, 조합, 또는 열거형의 태그(구조, 조합 또는 열거형의 키워드는 다음 32에 따라 구분됨);

예를 들어 다음 프로그램을 생각해 봅니다.

#include <stdio.h>

typedef struct {
    float  real;
    float imag;
} COMPLEX;

int main(void) 
{
    int COMPLEX;
    COMPLEX c = { 0.0f, 0.0f };
    
    return 0;
}

로컬 변수 COMPLEX의 선언은 파일 범위에 선언된 이름 없는 구조의 별칭 이름을 숨기므로 컴파일러가 오류를 발생시킵니다.

하지만 만약 당신이 글을 쓴다면,

#include <stdio.h>

typedef struct COMPLEX {
    float  real;
    float imag;
} COMPLEX;

int main(void) 
{
    int COMPLEX;
    struct  COMPLEX c = { 0.0f, 0.0f };
    
    return 0;
}

그러면 로컬 변수의 이름 COMPLEX가 구조물의 태그 이름 COMPLEX와 충돌하지 않습니다.C 컴파일러는 선언된 변수를 사용하지 않는 메시지만 발행할 수 있습니다.

또 다른 중요한 차이점은 구조 정의 자체 내에서 선언된 구조 지정자를 참조해야 하는 경우가 있다는 것입니다.

예를 들어 C에서 단일 연결 목록을 선언하려면 다음과 같이 써야 합니다.

typedef struct Node
{
    int data,
    struct Node *next;
} Node;

태그 이름이 없으면 다음과 같습니다.

typedef struct 
{
    int data,
    struct Node *next;
} Node;

컴파일러는 이 구조 정의를 두 가지 다른 유형의 지정자의 선언으로 간주합니다: 별칭 이름이 Node인 이름 없는 구조와 태그 이름이 Node인 다른 구조.이 유형들은 호환되지 않습니다.

는 C++ 는라는 할 수 .struct

예를들면

struct complex{
    float  real;
    float imag;
};

struct complex c1;
complex c2;

또한 키워드 구조를 사용하지 않고 구조 지정자를 정의 내에서 참조할 수 있습니다(C++ 15 Standard, 9 Class).

2 클래스 이름이 표시된 직후 선언되는 범위에 클래스 이름이 삽입됩니다.클래스 이름은 클래스 자체의 범위에도 삽입됩니다. 이를 injected-class-name이라고 합니다.

예를들면

struct Node
{
    int data,
    Node *next;
};

그러나 역시 변수나 함수의 선언은 구조의 선언을 숨길 수 있습니다.이 경우 키워드 구조를 사용해야 합니다.키워드 구조와 함께 이름을 사용하는 것을 C++에서 정교형 지정자로 부릅니다.

예를들면

struct complex{
    float  real;
    float imag;
};

int complex;
struct complex c;

정수 변수의 선언은 구조의 선언을 숨기므로 키워드 구조를 지정하지 않으면 컴파일러가 오류를 발생시킵니다.

많은 프로그래머들이 C와 C++의 유형 정의를 다음과 같이 다시 쓸 수도 있다는 것을 알지도 못한다는 것에 주목하십시오.

struct COMPLEX {
    float  real;
    float imag;
} typedef COMPLEX;

이것은 정말로 C와 C++ 사이에서 형식 체계가 미묘하게 변했기 때문입니다.C의 사용자 정의 구조(및 enum)에는 "태그"가 있었으며, 이는 유형과 다른 것으로 취급되었습니다.

struct 태그 {/*일부 멤버*/};
typedefect Tag Type; /* 태그와 Type은 동일한 이름일 수 있습니다 */

예에서 볼 수 있듯이 이러한 작업 방식은 여전히 지원되지만 C++는 구조 태그도 항상 유형이라는 새로운 규칙을 추가했습니다.따라서 C 관점에서 보면 C++ 컴파일러가 당신을 위해 타이프를 추가하는 것과 같습니다.따라서 C++에서는 더 이상 구조 유형의 변수를 선언하기 전에 "구조"라고 말할 필요가 없습니다.

예, 두 방식 모두 "올바른" 방식이고, 하나는 기존의 C 방식이며, 다른 하나는 C와 C++ 방식 모두에서 작동하며, C에서 컴파일되지 않습니다.예를 들어 코드 일부에 대해 C 호환성이 필요했지만 전부는 필요하지 않았을 수 있습니다.

C 호환성이 필요하다면 위의 패턴을 사용해야 하지만 네이티브 C++ 코드에 사용하는 것은 일반적인 관례가 아닙니다.

구조 정의는 다음과 같습니다.

struct type_name {
       member_type1 member_name1;
       member_type2 member_name2;
       .
       .
                } object_names;

구조체 이름과 개체 이름에 하나의 이름을 사용합니다.구조에 대한 이름을 선언하지 않고 구조 정의 안에 개체를 사용할 수 있습니다.

C/C++ 언어 같은 것은 없습니다.

주식회사.

   typedef struct complex {
        float real;
        float imag;
    } COMPLEX;

    COMPLEX c1;
    struct complex c2;

별칭struct complex타이핑하다COMPLEX

   typedef struct{
        float real;
        float imag;
    } COMPLEX;

    COMPLEX c1;

유형화할 별칭 태그 없는 구조COMPLEX

현실적인 차이는 무엇입니까?

첫 번째 개체를 사용하는 것처럼 새 유형을 사용하여 새 개체를 정의할 수 있습니다.COMPLEX그리고.struct complex.

두 번째 유형의 선언은 COMPLEX 유형을 사용한 정의만 허용합니다.

구조체 이름은 자신의 네임스페이스에 존재합니다.

struct complex {
    float real;
    float imag;
};

struct complex myvar; // in C and C++
complex myvar // only in C++!

C++는 구조 태그(가능하지 않은 경우)도 해결하지만 C는 해결하지 못합니다.typedef합니다에 합니다.

typedef struct complex COMPLEX;

이름을 정의할 것입니다.COMPLEXstruct complex.

이 선언문

typedef struct complex {
    float real;
    float imag;
} COMPLEX;

의 줄임말입니다

struct complex {
    float real;
    float imag;
};
typedef struct complex COMPLEX;

구조 태그를 모두 생략할 수도 있습니다.

typedef struct {
    float real;
    float imag;
} COMPLEX;

와 마찬가지로

struct {
    float real;
    float imag;
} myvar;

합니다를 합니다.myvar이름 없는 구조 타입으로.

언급URL : https://stackoverflow.com/questions/69159968/what-is-the-difference-between-these-two-structure-declarations

반응형