구조 정의는 .h 또는 .c 파일로 해야 합니까?
나는 두 가지 완전한 정의를 모두 보았다.struct
header 및 just declarations: 어떤 방식이 다른 방식보다 유리합니까?
차이가 있다면, 난 보통 이런 구조물을 타이핑했어.h
typedef struct s s_t;
명확하게 하기 위해 옵션은 헤더 파일의 선언과 클래스의 정의 또는 헤더 파일의 선언과 정의입니다.어느 한쪽이 링크에 의해서라도, 양쪽 모두 같은 사용성을 얻을 수 있을 것입니다.
여기와 같이 거의 중복된 항목이 많이 있지만 정확히 일치하는 항목이 없습니다.이 점에 있어서 제가 틀렸다면 정정해 주세요.
.h의 함수에 의해 사용되는 경우 해당 파일의 개인 구조는 .c 파일에 저장되며 선언은 .h 파일에 저장되어야 합니다.
공용 구조물은 .h 파일에 저장해야 합니다.
어느 한쪽이 링크에 의해서라도, 양쪽 모두 같은 사용성을 얻을 수 있을 것입니다.
아니요, 같은 헤더를 포함한 다른 .c 파일을 고려할 때는 그렇지 않습니다.구조 정의가 컴파일러에 표시되지 않으면 해당 정의의 세부 정보를 사용할 수 없습니다.정의가 없는 선언(예: just)struct s;
컴파일러가 내부를 조사하려고 하면 에러가 발생합니다.struct s
컴파일을 할 수 있습니다.struct s *foo;
(만약에foo
나중에 참조되지 않습니다).
의 다음 버전을 비교합니다.api.h
그리고.api.c
:
Definition in header: Definition in implementation:
+---------------------------------+ +---------------------------------+
| struct s { | | struct s; |
| int internal; | | |
| int other_stuff; | | extern void |
| }; | | api_func(struct s *foo, int x); |
| | +---------------------------------+
| extern void | +---------------------------------+
| api_func(struct s *foo, int x); | | #include "api.h" |
+---------------------------------+ | |
+---------------------------------+ | struct s { |
| #include "api.h" | | int internal; |
| | | int other_stuff; |
| void | | }; |
| api_func(struct s *foo, int x) | | |
| { | | void |
| foo->internal = x; | | api_func(struct s *foo, int x) |
| } | | { |
+---------------------------------+ | foo->internal = x; |
| } |
+---------------------------------+
API의 이 클라이언트는 다음 중 하나의 버전으로 동작합니다.
#include "api.h"
void good(struct s *foo)
{
api_func(foo, 123);
}
실장 상세 내용을 다음에 나타냅니다.
#include "api.h"
void bad(struct s *foo)
{
foo->internal = 123;
}
이는 "헤더 내의 정의" 버전에서는 동작하지만 "실장 내의 정의" 버전에서는 동작하지 않습니다.후자의 경우 컴파일러는 구조의 레이아웃을 확인할 수 없습니다.
$ gcc -Wall -c bad.c
bad.c: In function 'bad':
bad.c:5: error: dereferencing pointer to incomplete type
$
이 때문에, 「실장중의 정의」버전은, 프라이빗 실장의 상세를 우발적으로 또는 의도적으로 오용하는 것을 방지합니다.
구조체를 다른 컴파일 유닛(.c 파일)에서 사용하는 경우 헤더파일에 배치하여 필요에 따라 헤더파일을 포함할 수 있도록 합니다.
구조체가 하나의 컴파일 단위(.c 파일)에서만 사용되는 경우 해당 .c 파일에 배치합니다.
중요한 점은 헤더 파일에 배치하면 해당 헤더 파일을 포함하는 것만으로 여러 소스 파일에서 구조체(또는 다른 정의)를 사용할 수 있다는 것입니다.
단, 1개의 소스 파일에서만 사용할 수 있다고 확신하는 경우에는 전혀 차이가 없습니다.
오브젝트 지향성을 높이기 위해 그것들을 C파일에 넣었습니다.이 기사를 참조해 주세요.
언급URL : https://stackoverflow.com/questions/6316987/should-struct-definitions-go-in-h-or-c-file
'programing' 카테고리의 다른 글
Java 256비트 AES 패스워드 기반 암호화 (0) | 2022.08.11 |
---|---|
nuxt 앱 내의 Vuex가 "변환 핸들러 외부에 vuex 스토어 상태를 변환하지 않음!"을 슬로우합니다. (0) | 2022.08.11 |
vuex 상태 돌연변이가 UI를 차단함 (0) | 2022.08.11 |
VueRouter.beforeEach()에서 Vuex에 액세스할 때 저장소가 정의되지 않음 (0) | 2022.08.09 |
Java에서 메서드의 기본 범위는 무엇입니까? (0) | 2022.08.09 |