[c] 구조체 정의는 .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 파일에 넣었습니다 . 이 기사를 참조하십시오 .


답변

일반적으로 헤더 파일에 넣든 소스 파일에 넣든 큰 차이가 없다고 생각합니다. 그러나 여러 소스 파일에서 구조의 멤버에 액세스해야하는 경우 구조를 헤더 파일에 넣고 구조가 필요한 다른 파일에서 포함하는 것이 더 쉽습니다.


답변