📌 변수의 종류
여러가지 형태로 변수의 종류를 나누는데, 그 중 접근성을 기준으로 변수를 나누면
지역 변수와 전역변수 2가지로 나눌 수 있다.
위 둘을 나눌 때 분할 컴파일을 안한다는 것을 대전제를 둬야 한다.
무슨 말인지 예시를 들어보자.
main.c에서 main이 add란 함수를 부르거나 어떤 변수에 접근하는 모든 것이 main.c 파일안에 모든 코드를 기술한다.
즉, 하나의 소스 코드 파일을 가지고 모든 작업을 수행하는 것. 다시 말해 분할 컴파일이라는 걸 하지 않는다.
만약 main.c에서 모든 작업을 처리하지 않고, main.c, add.c로 파일을 분할해
컴파일을 하면 각각 구별된 .obj 파일을 생성하기 때문에 전역변수라고 하는 것은 하나의 파일에만 적용이 된다.
📌 외부 변수 선언
외부 변수 선언이란, 다른 파일 또는 코드 블록에서 정의된 변수를 현재 파일이나 코드 블록에서 사용할 수 있도록
선언하는 것을 의미한다.
외부 변수는 다른 파일에서 전역 변수를 사용할 때 필요하다. 한 파일에서 변수를 정의하고,
다른 파일에서는 extern 키워드를 사용해 참조하는 방식이다.
🔹 변수 정의
- 변수를 메모리에 할당하고 초기값을 결정
🔹 변수 선언
- 변수가 존재한다는 사실만 알리고, 실제 메모리 할당은 하지 않는다.
✅ 외부 변수 선언의 특징
- 메모리 할당이 없다.
- 다른 파일의 전역 변수를 사용이 가능하다.
- 초기화가 불가능하다.
예제를 살펴보자.
test.c 파일
#include<stdio.h>
int main(void)
{
int result = add(3,4);
printf("Result: %d\n", result);
return 0;
}
add.c 파일 ( add 함수 정의 )
int add(int a, int b)
{
int result = a + b;
return result;
}
위 상태로 빌드하면 warning이 출력된다. ( c++ 에서는 에러 )
컴파일러가 test.c에 있는 add()를 보고 함수를 확인한 후 add.c에 있는 add() 함수를 발견하고 알아서 이은 것이다.
경고가 안나오게 하려면 사용하는 쪽에서 함수를 선언해주면 된다.
test.c 수정 ( add 함수 선언 )
#include<stdio.h>
int add(int, int); // add 함수 선언
int main(void)
{
int result = add(3,4);
printf("Result: %d\n", result);
return 0;
}
위 코드처럼 함수를 선언해주면 더이상 warning이 발생하지 않는다.
이처럼 함수 선언을 따로 모은 파일을 헤더(.h)라고 부른다.
add 함수를 선언하는 헤더 파일을 생성
add.h
#pragma once
int add(int, int);
헤더라고 부르는 파일은 일반적으로 함수의 선언이 들어가 있다.
정의를 넣으면 헤더를 include 할때마다 중복되기 때문에 에러가 난다.
test.c 수정 ( add.h 을 include 한다 )
#include<stdio.h>
#include"add.h"
int main(void)
{
int result = add(3, 4);
printf("Result: %d\n", result);
return 0;
}
외부 변수
add.c
extern int result;
int add(int a, int b)
{
result = a + b;
return result;
}
test.c
#include<stdio.h>
#include"add.h"
int main(void)
{
add(3,4);
return 0;
}
add.c에 extern을 이용해 result을 선언하고 test.c를 위와 같이 수정한후 빌드하면
링크에러가 난다.
외부 변수로 선언한 result를 확인할 수 없다는 것인데,
extern을 이용해 앞에 붙이면 반드시 해당 변수를 다른곳에서 정의를 해주어야하기 때문이다.
즉 test.c에서 int result = 5; 라고 정의를 해주어야 링크에러가 잡힌다.
#include<stdio.h>
#include"add.h"
int result = 5;
int main(void)
{
add(3,4);
printf("Result: %d\n", result);
return 0;
}
위와 같이 구성하고 출력하면 7이 출력된다.
'강의 정리 > 인프런' 카테고리의 다른 글
[인프런] 함수 포인터 (0) | 2025.03.22 |
---|---|
[인프런] inline 함수와 컴파일러 최적화 (0) | 2025.03.17 |
[인프런] 형한정어와 컴파일러 최적화 (0) | 2025.03.11 |
[인프런] 함수 호출 규약 (0) | 2025.03.11 |
[인프런] 매개변수 전달 살펴보기 (0) | 2025.03.11 |