include statement, header 또는 source를 어디에 배치해야 합니까?
include를 헤더 파일에 넣어야 하나요, 소스 파일에 넣어야 하나요?헤더 파일에 include 문이 포함되어 있는 경우, 그 헤더 파일을 소스에 포함시키면 소스 파일에는 헤더에 포함된 모든 파일이 포함됩니까?아니면 소스 파일에만 포함시켜야 하나요?
put include in header 자체에서 필요한 경우에만 include를 입력합니다.
예:
- 는 유형을 합니다.
size_t
.그리고나서#include <stddef.h>
헤더 파일에 격납합니다. - 는 「」를 사용합니다.
strlen
.그리고나서#include <string.h>
소스 파일에 있습니다.
수년간 이것에 대해 꽤 많은 의견 차이가 있었다.한 때 헤더는 관련된 모듈의 내용만 선언하는 것이 일반적이었습니다.따라서 많은 헤더가 특정 요건을 가지고 있었기 때문에#include
특정 헤더 세트(특정 순서)를 지정합니다.일부 전통적인 C 프로그래머들은 여전히 (적어도 경우에 따라서는) 이 모델을 따르고 있습니다.
최근에는 대부분의 헤더를 독립형으로 만드는 움직임이 있습니다.헤더에 다른 것이 필요한 경우 헤더 자체가 처리하여 필요한 것이 모두 포함되도록 합니다(주문에 문제가 있는 경우 올바른 순서).개인적으로 저는 이것을 선호합니다. 특히 헤더의 순서가 중요할 때는 문제를 한 번 해결합니다.이것을 사용하는 모든 사람이 다시 문제를 해결하도록 요구하지 않습니다.
대부분의 헤더에는 선언만 포함되어 있어야 합니다.즉, 불필요한 헤더를 추가하는 것은 (통상) 최종 실행 파일에 영향을 주지 않습니다.최악의 경우 컴파일이 다소 느려집니다.
의 ★★★★★★★★★★★★★★★★★.#include
파일의 각 또는 헤더은 "" (")" ("")로 해야 합니다.#include
파일은 '''로 해야 합니다''#include
필요한 최소한의 헤더 파일 및 소스 파일도 필요합니다.단, 소스 파일에는 그다지 중요하지 않습니다.
.#include
및 그 " " " "#include
최대 네스트 깊이까지 등입니다.한 것을 않는 이다.#include
헤더 파일의 s: 소스 파일에 불필요한 헤더 파일이 많이 포함되어 컴파일 속도가 느려질 수 있습니다.
즉, 헤더 파일이 두 번 포함될 수 있으며, 이것이 문제가 될 수 있습니다.기존의 방법은 파일 foo에 대해 다음과 같이 헤더 파일에 "가드 포함"을 넣는 것입니다.h:
#ifndef INCLUDE_FOO_H
#define INCLUDE_FOO_H
/* everything in header goes here */
#endif
내가 20년 넘게 발전해 온 접근법은 이렇다.
도서관을 생각해 보세요.
C파일은 여러 개, 내부H파일은 1개, 외부H파일은 1개입니다.C 파일에는 내부 H 파일이 포함됩니다.내부 H 파일에는 외부 H 파일이 포함됩니다.
컴파일러 POV에서 C 파일을 컴파일할 때 계층이 있음을 알 수 있습니다.
외부 -> 내부 -> C 코드
서드파티가 라이브러리를 사용하기 위해 필요한 것은 외부 순서이기 때문에, 이것이 올바른 순서입니다.C 코드를 컴파일하려면 내부 코드가 필요합니다.
정수 및 함수 선언을 선언하는 데 필요한 파일만 헤더에 포함해야 합니다.기술적으로는 이러한 파일도 소스 파일에 포함되지만, 알기 쉽게 하기 위해 실제로 사용해야 하는 파일만 각 파일에 포함시켜야 합니다.따라서 헤더에 여러 항목이 포함되어 있지 않도록 보호해야 합니다.
#ifndef NAME_OF_HEADER_H
#define NAME_OF_HEADER_H
...definition of header file...
#endif
이로 인해 헤더가 여러 번 포함되지 않고 컴파일러 오류가 발생합니다.
포함된 파일만 사용하여 빌드할 수 있도록 모든 파일을 만듭니다.헤더에 인크루드가 필요 없는 경우 삭제합니다.대규모 프로젝트에서는 이 규율을 유지하지 않으면 해당 파일의 소비자가 사용하고 있는 헤더 파일이나 헤더에 의해 사용되고 있는 포함 파일을 누군가가 삭제하면 전체 빌드가 중단될 수 있습니다.
일부 환경에서는 필요한 헤더 파일만 포함하는 경우 컴파일이 가장 빠릅니다.다른 환경에서는 모든 소스 파일이 동일한 프라이머리 헤더 컬렉션을 사용할 수 있는 경우 컴파일이 최적화됩니다(일부 파일에는 공통 서브셋을 초과하는 추가 헤더가 있을 수 있습니다).여러 #include 작업이 영향을 미치지 않도록 헤더를 구성하는 것이 이상적입니다.#include 문장은 포함할 파일의 include-guard 체크로 둘러싸는 것이 좋을 수 있습니다.단, 가드의 형식에 의존하게 됩니다.또, 시스템의 파일 캐싱 동작에 따라서는, 타겟이 완전하게 #ifdefined 되는 불필요한 #include는 오래 걸리지 않을 가능성이 있습니다.
Another thing to consider is that if a function takes a pointer to a struct, one can write the prototype as
void foo(struct BAR_s *bar);
without a definition for BAR_s having to be in scope. A very handy approach for avoiding unnecessary includes.
PS--in many of my projects, there will be a file which it's expected that every module will #include, containing things like typedefs for integer sizes and a few common structures and unions [e.g.
typedef union { unsigned long l; unsigned short lw[2]; unsigned char lb[4]; } U_QUAD;
(Yes, I know I'd be in trouble if I moved to a big-endian architecture, but since my compiler doesn't allow anonymous structs in unions, using named identifiers for the bytes within the union would require that they be accessed as theUnion.b.b1 etc. which seems rather annoying.
헤더 파일 A의 경우#includes
헤더 파일 B와 C, 다음으로 모든 소스 파일 B와 C가#includes
A도 B와 C를 받는다.#included
프리프로세서는 문자 그대로 텍스트 치환만 수행합니다.즉, 다음과 같은 텍스트가 검출된 곳이면 어디서든#include <foo.h>
그것은 그것을 텍스트로 대체한다.foo.h
파일.
당신이 그것을 넣어야 하는지에 대해 의견이 분분하다.#includes
헤더 또는 소스 파일에 있습니다.저는 개인적으로 다 넣고 싶어요.#includes
다른 필수 헤더가 없으면 컴파일할 수 없는 헤더파일은, 디폴트로 소스 파일에 격납됩니다.#include
그 헤더들 자체입니다.
And every header file should contain an include guard to prevent it being included multiple times.
Your source file will have the include statements if your put it in the header. However, in some cases it would be better to put them in the source file.
Remember that if you include that header in any other sources, they will also get the includes from the header, and that is not always desirable. You should only include stuff where it is used.
ReferenceURL : https://stackoverflow.com/questions/3943352/where-to-put-include-statements-header-or-source
'programing' 카테고리의 다른 글
vuetify 데이터 테이블에서 행 내부의 버튼 클릭 이벤트와 행 클릭 이벤트를 분리하는 방법 (0) | 2022.07.12 |
---|---|
Vue-i18n '프록시에 정의되지 않은 속성 '_t'을 읽을 수 없습니다.Vue.$t' (0) | 2022.07.12 |
Vuejs 무중단 새로고침 정의되지 않은 속성 'CTor'를 읽을 수 없습니다. (0) | 2022.07.12 |
Vuex 저장소 상태가 업데이트되지 않음 (0) | 2022.07.12 |
페이지 지정 및 필터가 개별적으로 실행 중/Vue (0) | 2022.07.11 |