2017-12-03 3 views
0

C에서 ADT를 구현할 때 나는 항상 struct의 정의가 .c 파일에 있어야만 개인용이라고 생각했습니다. 그리고 typedef의 파일은 .h 파일에 있어야 다른 모듈이 ADT를 사용할 수는 있지만 해당 특성을 직접 수정할 수는 없습니다. 최근 문제가 발생하여 구조체를 .h으로 이동해야했습니다. 나는 또한 대답 Error: In C, got the error "dereferencing pointer to incomplete type" in a struct pointer을 찾았는데 struct.c 파일에 정의되어야한다. 사실입니까? 그렇다면 이유는 무엇입니까?구조체의 정의는 어디에서 C로 선언해야합니까? .c 또는 .h?

+2

정확히 무엇입니까? struct 정의가 여러 .c 파일에서 필요하면 헤더에 있어야하며, 그렇지 않으면 필요하지 않습니다. –

+0

@ M.M 하나의 .c 파일에만 필요합니다. 내 질문은 좋은 연습으로 간주되는 옵션이 있고 다른 옵션이 아닌 경우, 그리고 그럴 경우 그 이유입니다. – Nevado

+0

그건 실제로 의견의 문제입니다. 일반적으로 다른 곳에서 사용할 필요가 없다면 헤더에 무엇인가 넣지 않는 것이 좋습니다. –

답변

2

난에서 언급 된 바와 같이 comment :

ADT위한 구조 정의는 일반적으로 지원 함수를 정의하는 소스 (.c) 파일이어야하며, 단지 타입 선언 헤더에 존재한다 (.h) 파일.

그러나 이는 ADT를 정의하는 소스 파일 외부에서 구조의 인스턴스를 할당 할 수 없음을 의미합니다. 외부 ADT에 대한 포인터 만 정의 할 수 있습니다.

원본에서 헤더로 정의를 이동해야한다면 포인터를 사용하고 있어야하는 포인터를 사용하고 있지 않은 것을 의미합니다. 돌아가서 깨진 코드를 수정하고 구조체 정의를 ADT의 소스 파일로 다시 이동하십시오.

그리고 comment에 무엇이 Nevado인지 확인하면 ADT 배열을 가질 수 없음을 의미합니다. ADT에 대한 포인터의 배열은 가질 수 있지만 ADT의 배열은 가질 수 없습니다.

구조체가 원하는대로 또는 필요한 경우 구조체를 노출하는 것이 가장 합리적임을 유의하십시오. 그런 다음 데이터 유형 또는 그 배열의 변수를 만들거나 다른 구조 등에 유형 (유형에 대한 포인터가 아닌)을 포함시킬 수 있습니다. 구조체를 사용하는 코드를 작성하는 프로그래머는 세부 사항을 볼 수 있으며 구조체 요소에 직접 액세스 (읽기 또는 수정) 할 수 있습니다. 신중한 프로그래머들은 불필요하게 그렇게하지 않을 것이지만, 엄격한 ADT 관용구에 의해 배제 된 가능성을 열어줍니다.

관련 문제