programing

C11이 익명 구조를 지원하지 않는 이유는 무엇입니까?

javajsp 2023. 6. 28. 21:19

C11이 익명 구조를 지원하지 않는 이유는 무엇입니까?

C11은 다음과 같은 익명 구조를 지원합니다.

struct Foo
{
    struct
    {
        size_t x, y;
    };
};
struct Foo f;
f.x = 17;
f.y = 42;

기본적으로 그런 멤버들은.struct마치 그들이 동봉한 구성원인 것처럼 취급됩니다.struct또는union(따라서, 주변 구조 자체가 익명인 경우).

익명 구조를 포함하지 않는 C++11의 근거는 무엇이었습니까?이들은 일반적으로 유용하지 않습니다(대부분 유니언 내부에서, 식별자의 타이핑을 제거합니다).struct), 물론입니다.그러나 최소한 C11 표준과의 호환성을 유지하기 위해 논의되었을 것이라는 점에서 사양(및 이미 많은 컴파일러에 의해 구현된 사양)에 충분히 추가된 것으로 보입니다.그럼 왜 추가되지 않았을까요?

두 언어가 발전함에 따라 C++와 C 사이의 호환성을 유지하기 위한 노력은 거의 이루어지지 않았습니다.가변 길이 스택 배열은 1999년부터 C에 있었지만 C++11에는 포함되지 않았습니다.그들은 일반적으로 서로 모순되는 것들을 소개하지 않지만, C++ 위원회는 C++11이 C89 이후의 C 버전과 호환되도록 확실히 하기 위해 정확히 뒤로 굽히지 않습니다.

게다가, 이 기능은 C++에서 꽤 복잡할 것입니다, 왜냐하면struct그 이상도 이하도 아닙니다.class그리고 익명 구조/클래스는 일반 구조/클래스의 모든 특징을 가져야 합니다. 그렇죠?그렇지 않으면 그게 무슨 소용이 있겠습니까?

이름을 밝히지 않은 사람을 만드는 것은 무엇을 의미합니까?struct생성자를 어떻게 정의하시겠습니까?다음과 같은 간단한 것:

struct Foo
{
    struct
    {
        size_t &x;
    };
};

내면이 있기 때문에 불가능합니다.struct생성자가 없습니다.그리고 그것을 특정할 방법이 없습니다.astruct다른 멤버를 구성할 수 없습니다.struct그 안에

이와 같은 경우:

struct Foo
{
    size_t outer;
    struct
    {
        void SomeFunc();
        size_t x;
    };
};

무엇을this포인터가 합니다.SomeFunc어떤 종류의 것을 알겠습니까?thisbe, 이름도 없고 이름도 없는 타입?어떻게 정의하겠습니까?SomeFunc구조물 밖에서?의 이름SomeFunc있을 수 없는Foo::SomeFunc,왜냐면SomeFunc내면의 영역에 사는 삶.

C++가 다루기에는 너무 복잡합니다.그리고 물론 그 복잡성을 추가할 만큼의 가치는 없습니다.

악마의 옹호자 놀이 - 클래스 및 구조체 선언은 클래스별 유형 선언을 묶는 데 자주 사용됩니다.

typedef struct {

} name;

그러므로 허용되어야 합니다.

그러므로

struct {

} 

역시 그래야 합니다.

그러나 이것을 클래스의 내부 네임스페이스 내의 선언으로만 간주하면 구조체 내부에 액세스할 수 없습니다.

C에서 struct!= 네임스페이스를 사용하기 때문에 C는 주변 구조를 통해 익명 구조에 액세스하는 것과 같은 규칙을 구성할 수 있습니다.

C++가 이를 허용하려면 이 상황을 특수하게 처리해야 하며, 이는 이름 해결을 복잡하게 됩니다.

물론, 악마의 옹호자 역할을 하는 C는 실제로 이것을 했습니다.이름 결정에 추가 수준을 추가했습니다. 구조체에서 이름을 찾을 수 없는 경우 구조체의 익명 구성원을 확인하십시오.C++ 위원회 위원들이 짜증을 내는 것을 볼 수 있을 정도로 약간 마술적입니다.

또한 부모 클래스를 통해 익명 구조에 액세스할 수 있는 경우 네임스페이스의 익명 구조는 어떨까 하는 의문도 제기합니다.

물론, 만약 당신이 정말로 알고 싶다면, Stroustrup에게 물어보세요 - 그는 이메일에 응답합니다.

언급URL : https://stackoverflow.com/questions/8622459/why-does-c11-not-support-anonymous-structs-while-c11-does