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 파일에 넣었습니다 . 이 기사를 참조하십시오 .
답변
일반적으로 헤더 파일에 넣든 소스 파일에 넣든 큰 차이가 없다고 생각합니다. 그러나 여러 소스 파일에서 구조의 멤버에 액세스해야하는 경우 구조를 헤더 파일에 넣고 구조가 필요한 다른 파일에서 포함하는 것이 더 쉽습니다.