JollyTree의 C언어 기초코딩: 예제로 간단 정리 - 7.전역변수(Global Variable)와 지역변수(Local Variable) 그리고 변수의 특성(feat. 함수) - static, extern 자료 추가
정리 내용 요약
- 변수의 범위, 유형, 속성, 생존 시간 - static, extern 키워드를 지정한 함수와 변수 선언 방법 |
안녕하세요 JollyTree입니다(•̀ᴗ•́)و
지난 번 포스팅 했던 전역변수&지역변수와 관련해서 static, extern에 대한 기록이 부족하여 추가합니다.
static 키워드는 함수에도 적용할 수 있습니다. 규모가 있는 프로그램들은 여러 개의 소스코드 파일(a.cpp, b.cpp, c.cpp...)로 구성됩니다. a.cpp내에 func()함수를 정의했다고 가정했을 때 b.cpp내에서도 a.cpp내의 func()함수를 호출할 수 있지만 a.cpp 파일에서 함수 선언시 static int func() 라고 static을 지정하면 b.cpp이든 c.cpp이든 간에 a.cpp내의 func()함수를 호출할 수 없습니다. static을 지정하면 해당 b.cpp내에서만 사용이 가능합니다.
만약에 a.cpp와 b.cpp 파일 내에 동일하게 static int func()함수가 정의되어 있고 a.cpp, b.cpp내에서 각각 func()함수를 호출한다면 각각의 소스파일 내부에 선언된 func() 함수가 우선 적용됩니다.
또한 a.cpp와 b.cpp에 static을 지정하지 않은 동일한 이름의 함수가 있다면 컴파일러는 다음과 같은 에러를 발생시킵니다.
void __cdecl a_print(int)" (?a_print@@YAXH@Z) already defined in b.obj
아래는 static, extern 키워드에 대한 예제입니다. 여러 개의 헤더와 소스코드 파일로 구성되어 있으니 참고하세요.
static 함수&변수 그리고 extern 예제(Examples):
소스파일(maincodes.cpp)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <stdio.h>
#include "a.h"
#include "b.h"
#include "c.h"
int global_num = 100;
int main()
{
a_print();
b_print();
c_print();
return 0;
}
|
cs |
헤더파일(a.h)
1
2
3
4
5
6
|
#pragma once
//함수 원형(function prototype)
static int func(int a, int b);
void a_print(void);
void a_print_count(void);
|
cs |
소스파일(a.cpp)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <stdio.h>
//static 변수
static int a_count = 100;
//static 함수
static int func(int a, int b)
{
return a + b;
}
//일반 함수
void a_print(void)
{
printf(">> a.cpp의 정적함수 func() 실행 결과 : %d\n", func(10, 20));
}
void a_print_count(void)
{
printf(">> a.cpp 파일 내의 a_count : %d\n", a_count);
}
|
cs |
헤더파일(b.h)
1
2
3
4
5
|
#pragma once
//함수 원형(function prototype)
static int func(int a, int b);
void b_print(void);
|
cs |
소스파일(b.cpp)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <stdio.h>
//static 변수
static int b_count = 200;
//static 함수
static int func(int a, int b)
{
return a * b;
}
//일반 함수
void b_print(void)
{
printf(">> a.cpp의 정적함수 func() 실행 결과 : %d\n", func(10, 20));
}
|
cs |
헤더파일(c.h)
1
2
3
|
#pragma once
void c_print(void);
|
cs |
소스파일(c.cpp)
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
|
#include <stdio.h>
//extern 함수 선언
extern void a_print(void);
extern void b_print(void);
extern void a_print_count(void);
extern int global_num;
//extern int a_count;
void c_print(void)
{
/* c.cpp에서는 a.cpp, b.cpp내의 일반 함수를 통해 static 함수와 변수에 접근
*/
printf(">> c.cpp의 c_print()함수가 a.cpp에 있는 일반함수 a_print()를 호출 -> ");
a_print();
printf(">> c.cpp의 c_print()함수가 b.cpp에 있는 일반함수 b_print()를 호출 -> ");
b_print();
printf(">> c.cpp의 c_print()함수가 전역변수인 global_num 값을 출력 : %d\n", global_num);
//printf("a_count = %d\n", a_count);
printf(">> c.cpp의 c_print()함수가 a.cpp에 있는 a_print_count 함수를 호출하여 a.cpp 내의 전역변수인 a_count 값을 출력 : ");
a_print_count();
}
|
cs |
만약에 a.cpp에 선언된 static int a_count = 100; 를 c.cpp 파일에서 extern int a_count;라고 선언하더라도 컴파일러는
다음과 같은 에러를 유발합니다. static 변수도 a.cpp 즉, 해당 소스코드 파일에서만 사용 가능하기 때문입니다.
c.obj : error LNK2001: unresolved external symbol "int a_count" (?a_count@@3HA)
마지막으로 extern 키워드도 extern int global_num; 또는 extern int func();와 같이 변수나 함수의 자료형 앞에 지정할 수 있는데, extern은 컴파일러에게 어딘가에 extern 변수나 함수가 선언되어 있으니 참고해라고 알려주는 것입니다. 만약에 c.cpp 파일에서 extern int global_num; 라고 선언하지 않았다면 컴파일러는 int global_num; 를 찾지 못해 다음과 같은 에러를 보여주게 됩니다.
error C2065: 'global_num': undeclared identifier
변수의 유형과 범위 그리고 생존시간과 함께 static, extern 키워드 사용에 대해 정리해 보았습니다. 포스팅한 자료들을 공개로 설정하다 보니 아무래도 완성도에 신경을 쓰게 되는 것 같습니다. 조금이라도 유익한 자료가 되었으면 합니다.
이상 JollyTree였습니다(•̀ᴗ•́)و
'Coding & Programming > C언어 기초(A-Z)' 카테고리의 다른 글
[C언어 기초코딩: 예제로 간단 정리] 10. 구조체(structure) (0) | 2021.03.17 |
---|---|
[C언어 기초코딩: 예제로 간단 정리] 9. 포인터(Pointer) (0) | 2021.03.16 |
[C언어 기초코딩: 예제로 간단 정리] 8.배열(array) (0) | 2021.03.14 |
[C언어 기초코딩: 예제로 간단 정리] 7. 전역변수(Global Variable)와 지역변수(Local Variable) 그리고 변수의 특성( (0) | 2021.03.12 |
[C언어 기초코딩: 예제로 간단 정리] 6. 함수(Function) (0) | 2021.03.11 |