일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 자바set
- 백준
- jetpack
- 파이썬문법
- disposableeffect
- ContentProvider
- 백준파이썬
- 자바
- nullpointerexception방지
- 오블완
- 문자열
- Dependency
- Kotlin
- 파이썬
- composelifecycle
- 자료형
- Java
- programmers
- 자바리스트정렬
- 티스토리챌린지
- 배열
- 리스트
- android
- Hilt
- 프로그래머스
- list
- Python
- compose
- Provider
- filternotnull()
- Today
- Total
study gomi
[c] 한 project내 다른 소스 파일에 있는 함수 사용하기 (visual studio 화면 참고) 본문
c공부 중...
visual studio도 거의 처음 써 봤다.
같은 프로젝트 내에서 한 소스 파일에서 다른 소스 파일에 정의된 함수를 호출해서 사용하려고 했는데 에러가 발생했다.
android studio만 사용해왔던 나에겐 너무 생소...
암튼 그래서 알아봤는데 헤더 파일이 필요하다구....
문제 상황
일단 내 프로젝트 내 소스 파일 두 개 ↑
func_call.c에서 func_dummy.c의 함수 두 개(func1, func2)를 아래처럼 사용하려고 했는데 빌드 안 됨.
📌 C 파일 관리
Kotlin과 달리 자동으로 같은 패키지에 있는 클래스나 함수를 import 시키는 기능이 없음.
함수가 어디에 정의되어 있는지 명확하게 컴파일러에 알려줄 필요가 있다.
📌헤더 파일(.h)이 필요한 이유?
1. 컴파일러가 함수의 존재를 알아야 하기 때문
- func_dummy.c 에서 func1();을 호출한다고 할 때,
- 컴파일러는 func_dummy.c만 보고는 func1()이 어디에 있는지 모름.
- 그래서 함수가 어떤 파일에 정의되어 있는지 알려주는 역할을 하는 게 헤더 파일(.h)
2. 다른 소스 파일(.c)에서 함수를 사용하려면 extern 선언이 필요함.
- 함수가 정의된 파일과 호출하는 파일이 다를 때 함수 선언만 따로 헤더 파일(.h)에 적고 #include 하면 됨.
- 이렇게 하면 컴파일러가 함수의 선언을 보고 "아, 이런 함수가 있구나!"하고 넘어갈 수 있음.
- 근데 헤더 파일이 없이 하려면 extern 키워드를 직접 써줘야 하는데 좋은 방법은 아님.
- 이 방법보다는 함수 선언을 헤더 파일에 모아두고 #include "파일명.h"로 가져오는 게 더 편리하고 유지보수하기 좋음.
📌 헤더 파일 없이 하는 방법 (extern)
헤더 파일 없이도 다른 소스 파일의 함수를 사용할 수는 있지만 컴파일러가 함수의 존재를 모르면 오류가 남.
그래서 헤더 파일 없이 하려면 extern 키워드를 직접 써서 함수 선언을 수동으로 해줘야 함.
하지만 이 방법은 비효율적이고 유지보수가 어려워서 잘 안 씀.
// func_dummy.c의 함수가 여기 있다고 알려줌
extern void func1(void);
extern void func2(void);
int main(void) {
func1();
func2();
return 0;
}
📌 정리
같은 프로젝트 내에 있는 C 소스 파일을 가져다 쓰려면?
✅ 함수 정의 파일(.c)
✅ 함수 선언 파일(.h) → #include로 사용
✅ .c 파일끼리는 자동으로 연결되지 않음. 직접 선언이 필요!
📌 결론
1. 헤더 파일 추가
#pragma once
#ifndef FUNC_DUMMY_H
#define FUNC_DUMMY_H
// static 함수: 해당 파일 내에서만 쓸 수 있는 함수
void func1(void);
void func2(void);
#endif
2. 사용하려는 곳에서 추가한 헤더 파일을 include 해줌.
#include "func_dummy.h"
int main(void) {
func1();
func2();
return 0;
}
빌드 성공~
'basic > c' 카테고리의 다른 글
[C] 함수 작성 시 매개변수의 기본 값 지정? (0) | 2025.02.06 |
---|---|
[c] 매개변수가 없는 함수 선언 방법/C에서 매개변수 없는 함수의 경우 void를 써주는 이유 (c++과 차이) (1) | 2025.02.05 |