• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

ifndef와 macro 질문드립니다.

21.03.04 23:53 작성 조회수 201

0


안녕하세요! ifndef와 header guard 가 궁금하여 질문드려요!


어떻게 중복방지가 되는 것인지 그 원리가 궁금합니다!
#ifdef GUARD
#define GUARD

.

.

.

#endif 

Q1. 위와같은 구조에서,
        한번 include 됐으면 define이 되었을테니 
        다음에 include될때 ifndef에서 걸러져서 ifndef ~ endif 사이 ... 을 실행 안하는 것인가요?
        define 된 GUARD가  flag같은 느낌??? 으로 이해하면 될지...! 

Q2.  강의 동영상 7:52 경, static이라서 header에서 정의가 가능하다는게 무슨 말인지 잘 모르겠습니다 ㅠㅠ
          header 내에서는 function을 정의하면 안되는 것인가요?!

답변 1

답변을 작성해보세요.

5

안소님의 프로필

안소

2021.03.06

1. 네 제대로 이해하고 계십니다!

2. 헤더는 여러 c 파일에 복사될 수 있는 특수한 파일이죠! 만약 my_function 함수가 static이 아니라면 이 헤더파일을 인클루딩 하는 여러 c파일에 my_function 함수 바디가 정의되는 것이나 마찬가지입니다. 그러니 "중복 정의"가 되어 에러가 발생하겠죠. static 이 붙어있는 함수면 c 파일안에서만 유효한 함수라는 것이 보장되니(즉, c파일마다 이름은 같지만 별개인 함수) static 함수는 헤더파일에서 바디까지 정의해도 아무런 문제가 발생하지 않습니다. static을 붙이지 않은 그냥 일반 extern 전역 함수라면 헤더파일 내에 바디가 정의되어 있을 때 이것을 인클루딩하는 모든 c파일에 다 복사가되니 중복 정의 문제가 발생합니다. 그래서 보통 일반 함수(extern)는 헤더파일(aaa.h)에선 프로토타입 void func(int i ); 요런식으로만 두고 c파일 (aaa.c)에서 void func의 바디를 정의하는 이런식으로 구현을 많이 합니다. 여러 c파일에서 func 함수를 사용하긴 해야하니 헤더파일에 두긴 해야하는데 바디까지 정의하면 여러 c파일에서 인클루딩 할시 중복 정의 문제가 발생하니 헤더엔 프로토타입만, 그리고 아무 c 파일 하나에서 바디 정의해주는 식으로 구현을 많이 합니다.

m1n_q님의 프로필

m1n_q

질문자

2021.03.10

이해에 도움 주셔서 감사합니다 ㅠㅠ static은 헤더가 인클루드 될 c파일들을 위한 거였군요...