[임베디드 C] 헤더파일 & 소스파일

정재훈·2022년 4월 5일
0

임베디드 C언어

목록 보기
9/11
post-thumbnail

#include

해당 파일 내용을 그대로 가져온다.
#include <stdio.h> : stdio.h 파일을 가져온다. 설치된 라이브러리를 가져올 때는 < > 사용
#include "abc.h" : abc.h 유저 파일을 가져온다. 내가 만든 파일은 ""로 가져온다.

파일 내용을 그대로 가져오기 때문에, .c파일도 가져올 수 있지만, 쓰지 않습니다.

여러개의 헤더파일을 가지고 오는 경우, 함수의 중복전방선언에 주의하자!

C파일 include시 에러 발생 코드

전처리시 문제는 발생하지 않지만 링크할 때 변수가 중복되는 문제가 발생한다.

main.c

#include "소스1.c"

int main()
{

	return 0;
}

소스1.c

int x = 35;
int y = 44;

풀이

main.c#include로 인해 변수를 가지고 오브젝트 파일을 생성하고 소스1.c.h파일이 아니기 때문에, 소스1.c 또한 .o파일을 생성하게 된다. 2개의 .o 파일이 서로 링크하는 과정에서 똑같은 변수명을 지니고 있기 때문에 에러가 발생한다.

header 파일은 전처리는 되지만 컴파일 되지 않습니다.

Header Guard

한번 로딩된 .h 파일을 다시 불러오는 것을 생략하는 방법
abc.h 파일에 대한 Header Guard를 작성해보면,

중복을 유발하는 모든 헤더파일에 Header Guard를 작성해주어야 합니다.

vs에서만 가능

#pragma once  
#include "abc.h"

gcc 표준


#ifndef	_ABC_H_  // 정의 되어 있지 않다면 
#define _ABC_H_  // 원하는 이름으로 정의 

#include "abc.h"

#endif

Header Guard를 선언하는 2 방식은 모두 같은 결과를 초래한다.

여러개의 소스파일 나누기

헤더 파일은 함수를 선언 소스 파일은 함수를 정의 로 나누어야 에러 발생을 방지한다.

컴파일 에러가 아니여서 헤더 가드로도 못막고 링크 에러 발생하는 경우가 많다.

main code : 프로그램 시작시 동작하는 코드, 호출 x, header 파일 없어도 됨
api code : 누군가 호출하는 코드, 여러개의 소스파일이 include 가능, header와 source 나누어서 구현

static

외부 모듈로 부터 변수를 감추는 안보이게 하는 기능 , extern을 사용해도 가져오지 못함

  1. 함수내의 지역변수 앞에 붙는 경우 : 함수 외에서는 변수를 사용하지 못함
  2. 전역변수 앞에 붙는 경우 : 다른 파일에서 해당 변수를 사용하지 못함
  3. 함수 앞에 붙는 경우 : 다른 파일 에서 해당 함수를 사용하지 못함

함수내의 지역변수

#include <stdio.h>

void abc()
{
	/* 함수내의 지역변수 : 함수내에서만 사용가능한 변수로 해당 변수는 함수내에서만 
    사용가능한 전역변수라 생각하면 편하다. 변수가 프로그램 끝날때까지 유지된다. */
	//static int cnt;  // 정적 지역 변수 => 출력 : 5 10 15
	int cnt = 0;   // 지역변수 => 출력 : 5 5 5
	for (int i = 0; i < 5; i++) cnt++;
	printf("%d\n", cnt);
}

int main()
{
	abc();
	abc();
	abc();

	return 0;
}

extern

타 파일에서 함수 가져오는 것은 그냥 선언하면 된다. 하지만, 변수는 extern을 앞에 붙여줘야한다. 불러올 원본은 소스파일에 적혀있어야 한다.

extern을 활용하여 타 파일의 자료를 가져오는 방법으로는 2가지가 있다.

  1. 소스파일에 extern 사용하기
  2. 헤더파일에 extern 사용하기 (강추)

1. 소스파일에 extern 사용하기

main.c

#include <stdio.h>

int main()
{
	void abc();  // 선언으로 타 파일에서 함수 가져오기
	extern int t; // extern을 붙여 주어 타 파일에서 변수 가져오기

	printf("%d\n",t); // 10
	abc(); // HI
	
	return 0;
}

소스.c

int t = 10;

void abc()
{
	printf("HI");
}

2. 헤더파일에 extern 사용하기 (강추)

main.c

#include <stdio.h>
#include "헤더.h" // extern 한거 include

int main()
{
	printf("%d\n",t); // 10
	abc(); // HI
	
	return 0;
}

소스.c

int t = 10;

void abc()
{
	printf("HI");
}

헤더.h

#pragma once
void abc(); // 헤더에서 extern
extern int t; 
profile
여러 방향으로 접근하는 개발자

0개의 댓글