#ifndef는 C에 가드 포함

Jinku Hu 2023년10월12일
  1. ifindefe를 사용하여 C에 헤더 파일이 여러 개 포함되지 않도록 보호
  2. ifndef 지시문을 사용하여 매크로가 C에서 여러 번 정의되지 않도록합니다
#ifndef는 C에 가드 포함

이 기사는# ifndef를 사용하는 방법에 대한 여러 가지 방법에 대해 설명합니다.

ifindefe를 사용하여 C에 헤더 파일이 여러 개 포함되지 않도록 보호

C의 헤더 파일은 동일한 이름의 소스 파일에 구현 된 함수에 대한 인터페이스를 정의하는 데 사용됩니다. 인터페이스에는 일반적으로 함수 프로토 타입, 공개적으로 액세스 할 수있는 데이터 구조에 대한 정의 및 기타 기타 항목이 포함됩니다.

헤더 파일이 소스 파일에 여러 번 포함되어 컴파일러 오류가 발생할 수 있습니다. 일반적으로 이것은 래퍼#ifndef라고하는#ifndef 전 처리기 지시문으로 방지됩니다. 헤더 파일의 내용이 다음 예제와 같은 구조로 묶인 경우, 여기서 지시어#ifndef MY_GUARD는 시작점이고# endif는 끝점입니다. ifndef 지시문은MY_GUARD 매크로가 정의되어 있는지 확인하고 그렇지 않은 경우 다음 지시문으로 정의합니다. 사용자가 동일한 헤더를 두 번째로 포함하는 경우ifndef 지시문은 false로 평가되고#endif 지시문 앞의 코드를 무시합니다. 결과적으로 컴파일러는이 헤더 파일에서 코드 사본을 하나만 가져 와서 성공적으로 번역합니다.

#include <stdio.h>

#ifndef MY_GUARD
#define MY_GUARD 1

#define PER(D) #D
#define JOIN(A, B) (A##B)
#define JOINX(A, B) JOIN(A, B)

int power(int base, int n) {
  int p = base;
  for (size_t i = 0; i < n; i++) {
    p *= base;
  }
  return p;
}
#endif

동일한 결과를 얻는 또 다른 방법은 헤더 파일에#pragma once 지시문을 포함하는 것입니다. 전처리 기는 이러한 헤더 파일을 한 번만 스캔하고 다시 읽지 않도록합니다. 다음 방법의 한 가지 단점은 서로 다른 전 처리기간에 이식성이 낮다는 것이므로 코드베이스의 유연성을 높이기 위해 래퍼#ifndef 메서드를 고수 할 수 있습니다.

#include <stdio.h>

#pragma once

#define PER(D) #D
#define JOIN(A, B) (A##B)
#define JOINX(A, B) JOIN(A, B)

int power(int base, int n) {
  int p = base;
  for (size_t i = 0; i < n; i++) {
    p *= base;
  }
  return p;
}

ifndef 지시문을 사용하여 매크로가 C에서 여러 번 정의되지 않도록합니다

또는ifndef 지시문을 사용하여 주어진 매크로 표현식이 이미 정의되었는지 확인할 수 있습니다. 논리는 이전 예제에서와 동일하게 작동합니다. 표현식이 정의되지 않은 경우 다음#define 지시문이 그에 따라 처리됩니다. #ifndef#endif 사이의 유일한 줄은 하나의 매크로 정의입니다. 즉, 조건이 false 인 경우 지정된 매크로 만 정의를 건너 뜁니다.

#include <stdio.h>
#include <stdlib.h>

#define PER(D) #D

#ifndef DLEVEL
#define DLEVEL 6
#endif

int main() {
  for (int j = 0; j < DLEVEL; ++j) {
    printf("%s\n", PER(stringify this));
  }

  exit(EXIT_SUCCESS);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook