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
'programing' 카테고리의 다른 글
Javascript/jQuery를 사용하여 이미지가 로드되었는지 확인하려면 어떻게 해야 합니까? (0) | 2023.10.02 |
---|---|
C에서 char **는 무엇입니까? (0) | 2023.10.02 |
Oracle용 Eclipse Database Tools에서 자동 커밋을 비활성화하는 방법은 무엇입니까? (0) | 2023.10.02 |
실행 중인 합계로 자동 업데이트하려면 SQL 합계 테이블이 필요합니다.트리거를 사용해야 합니까 아니면 (php와) 병합해야 합니까?3개의 트리거를 1개로 결합하려면 어떻게 해야 합니까? (0) | 2023.10.02 |
텍스트 영역에서 줄 바꿈 유지 (0) | 2023.10.02 |