programing

C에서 구조의 포인터는 항상 첫 번째 부재를 가리킵니까?

javamemo 2023. 10. 2. 10:48
반응형

C에서 구조의 포인터는 항상 첫 번째 부재를 가리킵니까?

특정 함수 집합을 사용하고자 하는 C 구조가 있다고 가정합니다.

다음 방법이 정당한 방법인지 궁금합니다.

typedef struct Base {
     int exampleMember;
     // ...
} Base;

typedef struct Foo {
     Base base;
     // ...
} Foo;

typedef struct Bar {
     Base base;
     // ...
} Bar;

void MethodOperatesOnBase(void *);

void MethodOperatesOnBase(void * obj)
{
     Base * base = obj;
     base->exampleMember++;
}

예제에서 두 구조가 모두Foo그리고.Bar첫머리에Base회원.

그리고 그 안에MethodOperatesOnBase, 제가 캐스팅을 했는데요.void *에 매개 변수를 지정합니다.Base *.

에 조언을 전하고 싶습니다.Bar에 대한 지침.Foo이 방법에 대하여 그리고 구조의 첫번째 부재에 의지하여 a.Base짜임새 있는

이것이 허용되나요, 아니면 제가 알아야 할 몇 가지 (아마도 컴파일러별) 문제가 있습니까? (예를 들어 구조체의 첫 번째 멤버의 위치를 변경하는 일종의 패킹/패딩 방식?)

네, C 표준은 이것이 효과가 있을 것이라고 구체적으로 보장합니다.

(C1x §6.7.2.1.13): "적절하게 변환된 구조물 객체에 대한 포인터는 초기 부재를 가리키며...구조체 개체로 이름 없는 패딩이 있을 수 있지만 처음에는 없을 수 있습니다.")

gtk+ 전체가 그렇게 구현됩니다.이보다 더 좋은 예는 없습니다.http://git.gnome.org/browse/gtk+/tree/gtk/ 에서 만나보세요.

저는 당신이 제안한 것이 효과가 있을 것이라고 말하는 어떤 대답에도 동의하지 않지만, (C++를 사용하는 것을 제안하지 않고) 좀 더 완벽한 토론을 위해, 다음과 같은 것을 하는 것은 어떨까요?

typedef struct Base ...  /* The types defined exactly as before */
typedef struct Foo ...
typedef struct Bar ...

/* The function takes a Base* since that is what it actually works with*/
void MethodOperatesOnBase(Base* pbase)
{
    /* Do something... */
}

/* Now call it like this: */
Foo foo;
Bar bar;

MethodOperatesOnBase(&foo.base);
MethodOperatesOnBase(&bar.base);

작동하지 않는 이유가 있나요? 당신이 사용해야 할 이유가 있나요?void *? 저는 이것이 훨씬 더 많은 작업이고 타입 안전이라는 장점이 있다고 생각하지 않습니다.

언급URL : https://stackoverflow.com/questions/7312555/in-c-does-a-pointer-to-a-structure-always-point-to-its-first-member

반응형