헤더에 #include를 사용해야 합니까?
하나요?#include
일부 파일(헤더(*.h) 내에 있는 경우)이 파일에 정의되어 있는 타입이 사용되고 있습니까?
를 들어, 를 하고, 「」, 「GLib」를 는,gchar
되어 있는 요?#include <glib.h>
'*.c'는 '*.c'로, '*.c'는 '*.c'로?
'네'라고 '네'와 '네' 요.#ifndef
★★★★★★★★★★★★★★★★★」#define
그 #define
C에 있는 헤더에 대한 NASA의 Goddard Space Flight Center(GSFC; 고다드 우주 비행 센터) 규칙은 소스 파일에 유일한 헤더로 헤더를 포함할 수 있어야 하며, 그 헤더가 제공하는 기능을 사용하는 코드를 컴파일합니다.
즉, 헤더는 자급자족하고 idempotent하며 최소여야 합니다.
- self-contained : 필요한 경우 관련 헤더를 포함하여 필요한 모든 유형을 정의합니다.
- idempotent : 컴파일은 여러 번 포함해도 중단되지 않습니다.
- minimal - 헤더에 의해 정의된 퍼실리티에 액세스하기 위해 헤더를 사용하는 코드로 불필요한 것은 정의되지 않습니다.
이 규칙의 장점은 헤더를 사용해야 할 경우 다른 헤더를 포함시켜야 하는 문제를 해결하기 위해 애쓸 필요가 없다는 것입니다.헤더가 필요한 모든 것을 제공한다는 것을 알고 있습니다.
가능한 단점은 일부 헤더가 여러 번 포함될 수 있다는 것입니다.그 때문에 다중 포함 헤더 가드가 중요합니다(또한 컴파일러는 가능한 한 헤더의 재포함을 피하려고 합니다).
실행
가 타입을 FILE *
'이른바'size_t
- - 그 른 른 른 른 른 른 른 른 른 른 른 른 른 ' ' ' - - - - - - - - - - - - - - - -<stdio.h>
★★★★★★★★★★★★★★★★★」<stddef.h>
예를 들어)을 포함해야 합니다.결과적으로 자주 잊어버리는 것은 패키지를 사용하기 위해 패키지 사용자가 필요로 하지 않는 다른 헤더를 헤더에 포함시키지 않는 것입니다.즉, 헤더는 최소여야 합니다.
또한 GSFC 규칙은 다음과 같은 간단한 기술을 제공합니다.
- 기능을 정의하는 소스 파일에서 헤더는 나열된 첫 번째 헤더여야 합니다.
그래서 마법 정렬이 있다고 가정해 봅시다.
magicort.h
#ifndef MAGICSORT_H_INCLUDED
#define MAGICSORT_H_INCLUDED
#include <stddef.h>
typedef int (*Comparator)(const void *, const void *);
extern void magicsort(void *array, size_t number, size_t size, Comparator cmp);
#endif /* MAGICSORT_H_INCLUDED */
Magicort.c
#include <magicsort.h>
void magicsort(void *array, size_t number, size_t size, Comparator cmp)
{
...body of sort...
}
에는 "Drughta"를하는 표준 헤더가 되어 있어야 합니다.size_t
이 표준 는 입니다.; 렇게하하 ; ; that음음음음음음음음음음음음음음음음음음음 ; ; ; ; ; ; ; ; ; ; 。<stddef.h>
몇 <stdio.h>
,<stdlib.h>
,<string.h>
, 아마 다른 몇 명일 것입니다.)
또, 전술한 바와 같이, 실장 파일에 다른 헤더가 필요한 경우는, 다른 헤더가 필요하게 됩니다.또한 추가 헤더가 필요한 것은 완전히 정상입니다.그러나 구현 파일('magicsort.c')은 그 자체를 포함해야 하며 헤더에 의존하지 않아야 합니다.헤더에는 소프트웨어 사용자가 필요로 하는 것만 기재하고 구현자가 필요로 하는 것은 기재하지 마십시오.
설정 헤더
코드가 설정 헤더(예를 들어 GNU Autoconf 및 생성된 'config.h')를 사용하는 경우 'magicsort.c'에서 이를 사용해야 할 수 있습니다.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif /* HAVE_CONFIG_H */
#include "magicsort.h"
...
모듈의 개인 헤더가 구현 파일의 첫 번째 헤더가 아님을 알 수 있는 유일한 경우입니다.단, 'config'의 조건부 포함.h'는 magicsort에 있어야 합니다.h' 그 자체.
2011-05-01 갱신
위에 링크된 URL은 더 이상 작동하지 않습니다(404).C++ 표준(582-2003-004)은 EverySpec.com에서 찾을 수 있습니다.C 표준(582-2000-005)이 동작하고 있지 않은 것 같습니다.
C 표준의 가이드라인은 다음과 같습니다.
§ 2.1 유닛
(1) 코드는 단위 또는 독립형 헤더 파일로 구성되어야 한다.
(2) 하나의 단위는 단일 헤더 파일(.h)과 하나 이상의 본문 파일(.c)로 구성된다.헤더 파일과 본문 파일을 통칭하여 소스 파일이라고 부릅니다.
(3) 단위 헤더 파일에는 클라이언트 단위에서 요구하는 모든 관련 정보가 수록되어야 한다.장치를 사용하려면 장치의 클라이언트가 헤더 파일에만 액세스해야 합니다.
(4) 단위 헤더 파일은 단위 헤더가 요구하는 다른 모든 헤더에 대한 #include 문을 포함해야 한다.이를 통해 클라이언트는 단일 헤더 파일을 포함하여 장치를 사용할 수 있습니다.
(5) 단위 본문 파일은 다른 #포함 문보다 먼저 단위 머리글에 대한 #포함 문을 포함해야 한다.이를 통해 컴파일러는 모든 필수 #include 문이 헤더 파일에 있는지 확인할 수 있습니다.
(6) 본문 파일은 하나의 단위와 관련된 기능만을 포함해야 한다.하나의 본문 파일은 다른 헤더로 선언된 함수에 대한 구현을 제공하지 않을 수 있습니다.
(7) 특정 단위 U의 일부를 사용하는 모든 클라이언트 단위는 단위 U의 헤더 파일을 포함해야 한다.이것에 의해 단위 U의 엔티티가 정의되는 장소는 1개뿐임을 보증한다.클라이언트 유닛은 유닛헤더에 정의되어 있는 함수만을 호출할 수 있습니다.본문에 정의되어 있는 함수는 호출할 수 없지만 헤더에 선언되어 있지 않습니다.클라이언트 유닛은 본문에 선언된 변수에 액세스할 수 없지만 헤더에는 액세스할 수 없습니다.
구성 요소는 하나 이상의 단위를 포함합니다.예를 들어, 산술 라이브러리는 벡터, 행렬 및 사분원과 같은 여러 단위를 포함하는 구성 요소입니다.
스탠드아론 헤더 파일에는 관련된 본문이 없습니다.예를 들어 공통 유형 헤더는 함수를 선언하지 않기 때문에 본문이 필요하지 않습니다.
장치에 여러 개의 본문 파일이 있는 몇 가지 이유는 다음과 같습니다.
- 바디 코드의 일부는 하드웨어 또는 OS에 의존하지만 나머지는 일반적입니다.
- 파일이 너무 큽니다.
- 유닛은 일반적인 유틸리티 패키지이며 일부 프로젝트에서는 일부 기능만 사용합니다.각 함수를 별도의 파일에 저장하면 링커는 최종 이미지에서 사용되지 않은 함수를 제외할 수 있습니다.
§ 2.1.1 헤더에 근거 포함
이 표준에서는 장치의 헤더가 다음을 포함해야 합니다.
#include
유닛 헤더가 필요로 하는 다른 모든 헤더에 대한 스테이트먼트.★★의#include
첫는 이 한 모든 되어 있는지 할 수 .#include
★★★★★★★★★★★★★★★★★★.기준에서는되지 않습니다.
#include
문; all " " " " " " " " , "#include
는 본문 파일에서 수행됩니다.에는, 「」라고 하는 파일이 포함되어 있을 가 있습니다.#ifdef
필요한 헤더가 올바른 순서로 포함되어 있는지 확인하는 문.의 장점 중 하나는 이 대체 디자인이라는 입니다.
#include
body file의 list는 make file에 필요한 의존관계 리스트이며 이 리스트는 컴파일러에 의해 체크됩니다.표준 설계에서는 도구를 사용하여 종속성 목록을 생성해야 합니다.단, 브런치가 권장하는 개발 환경에는 모두 이러한 툴이 있습니다.변경되었을 하는 각 하여 를 입니다.
#include
스이스또한 컴파일러 라이브러리 유닛에 필요한 헤더 리스트는 타깃마다 다를 수 있습니다.또 다른 파일 및 해야 한다는 입니다.
#ifdef
★★★★★★★★★★★★★★★★★★.다른 일반적인 방법은 프로젝트 헤더 파일 앞에 모든 시스템 헤더 파일을 본문 파일에 포함시키는 것입니다.일부 프로젝트 헤더 파일은 시스템 헤더 내의 정의를 사용하거나 시스템 정의를 재정의하기 때문에 시스템 헤더 파일에 의존할 수 있기 때문에 이 표준은 이 관행을 따르지 않습니다.에는, 「이러다」가 포함되어 있을 가 있습니다.
#include
시스템 헤더의 스테이트먼트를 지정합니다.본문에 먼저 포함되어 있는 경우 컴파일러는 이를 체크하지 않습니다.
GSFC Standard는 Internet Archive 2012-12-10에서 이용 가능
참조된 NASA C 코딩 표준은 인터넷 아카이브를 통해 액세스 및 다운로드할 수 있습니다.
시퀀싱
또, 다음과 같은 질문도 있습니다.
요?
#include
을 합니다.#ifndef
★★★★★★★★★★★★★★★★★」#define
그#define
.
은 올바른 포함 은 "네스트된 포함" 등의 .네스트된 인크루드(include) 등은 다음이어야 합니다.#define
(실행)#define
헤더에서 두 번째 줄 이외의 행이 되어야 합니다). 단, 그것이 올바른 이유는 설명되지 않습니다.
「 「 」를 「 」로 생각해 .#include
#ifndef
★★★★★★★★★★★★★★★★★」#define
자체에 가 포함되어 ,른른양양양양양양양양고고고,,,,,, ,,,, . . . . . . . . . . . . . . . . 。#include "magicsort.h"
두 포함의 magicsort.h
에 #define MAGICSORT_H_INCLUDED
헤더가 정의된 유형을 정의하기 전에 헤더가 두 번째로 포함됩니다. 및 의 C89'C99typedef
타입명이 잘못 정의되어(C2011에서는 같은 타입으로 재정의 가능), 헤더 가드의 목적을 무시하고 파일을 여러 번 처리하는 오버헤드가 발생합니다.또한 이것이 바로 그 이유이기도 합니다.#define
는 두 으로, 이 행의 바로 에 쓰여 .#endif
을 사용법
#ifndef HEADERGUARDMACRO
#define HEADERGUARDMACRO
...original content of header — other #include lines, etc...
#endif /* HEADERGUARDMACRO */
인크루드 파일에 #include 파일이 필요한 경우에만 #include 파일을 삽입하는 것이 좋습니다.지정된 include 파일의 정의가 .c 파일에서만 사용되는 경우 .c 파일에만 포함합니다.
당신의 경우 #ifdef/#endif 사이의 include 파일에 포함시키겠습니다.
이렇게 하면 의존성이 최소화되므로 include 파일이 변경되어도 include 파일이 필요하지 않은 파일을 다시 컴파일할 필요가 없습니다.
일반적으로 라이브러리 개발자는 #ifndef / #define / #endif "trick"을 사용하여 여러 개의 포함 항목을 보호하므로 사용자는 이를 수행할 필요가 없습니다.
물론, 당신은 확인해야 합니다...어쨌든 컴파일러에 의해 어느 시점에서 알 수 있습니다.-) 컴파일 사이클이 느려지기 때문에 여러 개의 포함을 체크하는 것이 좋습니다.
컴파일 중에 프리프로세서는 #include 디렉티브를 지정된 파일 콘텐츠로 대체하기만 하면 됩니다.엔드리스 루프를 방지하려면
#ifndef SOMEIDENTIFIER
#define SOMEIDENTIFIER
....header file body........
#endif
일부 헤더가 파일에 포함된 다른 헤더에 포함된 경우 파일에 재귀적으로 포함되므로 명시적으로 다시 포함할 필요가 없습니다.
네, 컴파일러가 인식되지 않는 코드를 컴파일하려고 하면 컴파일러가 불만을 제기합니다.컴파일러에 대한 #include는 컴파일러에 대한 힌트/눈치/엘보우이며 컴파일러가 성공적인 컴파일을 위해 선언이나 구조 등을 선택하도록 지시합니다.jldupont가 지적한 #ifdef/#endif 헤더 트릭은 코드 컴파일을 고속화하는 것입니다.
C++ 컴파일러를 사용하고 있는 경우에 사용되며, 다음과 같이 플레인 C 코드를 컴파일합니다. 다음은 트릭의 예입니다.
#ifndef __MY_HEADER_H__#정의 __MY_HEADER_H__ #ifdef __cplusplus외부 "C" {#엔디프 /* C 코드 (구조물, 선언 등)*/ #ifdef __cplusplus}#엔디프 #endif /* __MY_HEADER_H__ */
번 '이것'을 하여 한 시킵니다.__MY_HEADER_H__
한 번 정의되므로 컴파일 시간이 단축됩니다.위의 예에서 cplus라는 기호에 주목해 주십시오.이것은, C코드가 놓여 있는 경우에 C++ 컴파일을 처리하는 통상의 표준 방법입니다.
이것을 보여주기 위해서, 상기의 내용을 포함했습니다(포스터의 원래의 질문과는 그다지 관계가 없지만).이게 도움이 되길 바래, 안녕, 톰.
PS: C/C++를 처음 접하는 분들에게 도움이 될 것 같아서 실망스럽게 해드려서 죄송합니다.코멘트/비판 등을 매우 환영하는 내용으로 남깁니다.
헤더에서 헤더를 포함해야 하며 .c에는 포함할 필요가 없습니다.여러 번 포함할 필요가 없도록 #define 뒤에 include를 붙여야 합니다.예를 들어 다음과 같습니다.
/* myHeader.h */
#ifndef MY_HEADER_H
#define MY_HEADER_H
#include <glib.h>
struct S
{
gchar c;
};
#endif /* MY_HEADER_H */
그리고.
/* myCode.c */
#include "myHeader.h"
void myFunction()
{
struct S s;
/* really exciting code goes here */
}
필요한 include 파일이 include 전에 포함되었는지 확인하기 위해 다음 구성을 사용합니다.모든 헤더 파일을 소스 파일에만 포함합니다.
#ifndef INCLUDE_FILE_H
#error "#include INCLUDE.h" must appear in source files before "#include THISFILE.h"
#endif
일반적으로 필요한 모든 종속성을 올바른 순서로 포함하는 단일 포함 파일을 만듭니다.그래서 나는 다음과 같이 할 수 있다.
#ifndef _PROJECT_H_
#define _PROJECT_H_
#include <someDependency.h>
#include "my_project_types.h"
#include "my_project_implementation_prototypes.h"
#endif
모두 프로젝트입니다.이제 project.h는 주문요건 없이 어디에나 포함할 수 있지만 종속성, 유형 및 API 함수 프로토타입을 다른 헤더에 저장할 수 있습니다.
프로젝트의 공통 헤더 파일(global.h 등)에 모든 외부 헤더를 포함시켜 모든 c 파일에 포함시킵니다.
다음과 같은 경우가 있습니다.
#ifndef GLOBAL_GUARD
#define GLOBAL_GUARD
#include <glib.h>
/*...*/
typedef int YOUR_INT_TYPE;
typedef char YOUR_CHAR_TYPE;
/*...*/
#endif
이 파일에서는 include guard를 사용하여 여러 포함, 잘못된 다중 정의 등을 방지합니다.
언급URL : https://stackoverflow.com/questions/1804486/should-i-use-include-in-headers
'source' 카테고리의 다른 글
Vue js 마운트된 특정 div로 스크롤 (0) | 2022.08.28 |
---|---|
Javascript Package Manager를 사용하지 않고 VueJS 플러그인 포함 (0) | 2022.08.28 |
vim에 C가 있는 자동 삽입 공간? (0) | 2022.08.28 |
C 통역사가 있나요? (0) | 2022.08.28 |
Vue.js2 - 어레이에 __ob_: 옵서버가 포함되어 있습니다. (0) | 2022.08.28 |