.h 또는 .c 파일에 포함되어 있습니까?
struct
헤더에서 s의 전체 정의 와 헤더 만 보았습니다. 한 방법이 다른 방법에 비해보다 많은 이점이 있습니까?
차이가 나는 경우 일반적으로 다음과 같은 물건을 typedef합니다. .h
typedef struct s s_t;
편집하다
명확하게 말하면 옵션은 헤더 파일의 선언과 클래스의 정의 또는 헤더 파일의 선언과 정의입니다. 둘 다 연결에 의한 경우에도 동일한 사용을 가져야합니다. 보상 보편적입니까?
를 들어 예 여기 에는 거의 중복되는 항목이 많이 있지만 정확한 일치 여부 항목은 없습니다. 이 점에서 내가 틀렸다면 나를 바로 잡으십시오.
해당 파일의 개인 구조는 .c 파일에 있어야하며, .h의 함수에서 사용되는 경우 .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;
}
"definition in header"버전에서는 작동하지만 "definition in implementation"버전에서는 작동하지 않습니다. 후자의 경우 컴파일러는 구조의 레이아웃을 볼 수 없습니다.
$ gcc -Wall -c bad.c
bad.c: In function 'bad':
bad.c:5: error: dereferencing pointer to incomplete type
$
따라서 "구현시 정의"버전은 개인 구현 세부 사항의 우발적 또는 고의적 오용을 방지합니다.
구조체가 다른 컴파일 단위 (.c 파일)에서 사용되는 경우 헤더 파일에 배치하여 필요할 때마다 해당 헤더 파일을 포함 할 수 있습니다.
구조체가 하나의 컴파일 단위 (.c 파일)에서만 사용되는 경우 해당 .c 파일에 배치합니다.
요점은 헤더 파일에 배치하면 해당 헤더 파일을 포함하는 것만으로 여러 소스 파일의 구조 (또는 다른 정의)를 사용할 수 있다는 것입니다.
그러나 하나의 소스 파일에서만 사용된다는 것이 확실하다면 실제로는 아무런 차이가 없습니다.
좀 더 객체 지향적으로 만들기 위해 C 파일에 넣었습니다 . 이 기사를 참조하십시오 .
일반적으로 헤더 파일에 넣든 소스 파일에 넣든 큰 차이가 없다고 생각합니다. 그러나 여러 소스 파일에서 구조의 멤버에 액세스해야하는 경우 구조를 헤더 파일에 넣고 구조가 필요한 다른 파일에서 포함하는 것이 더 쉽습니다.
참고 URL : https://stackoverflow.com/questions/6316987/should-struct-definitions-go-in-h-or-c-file
'IT' 카테고리의 다른 글
iPhone / iPad 사용자를 : hover 가상 클래스를 강제로 무시할 수 있습니까? (0) | 2020.08.30 |
---|---|
Django 설정 기본 로깅 (0) | 2020.08.30 |
키 체인 항목을 고유하게 만드는 것은 무엇입니까 (iOS에서)? (0) | 2020.08.30 |
연결 목록의 중간에 삽입하는 이유 O (1)? (0) | 2020.08.30 |
.NET 어셈블리에 서명하지 않는 데 문제가 있습니까? (0) | 2020.08.30 |