기본적으로 소스파일이 같은 프로젝트에 있어서 컴파일할 때 링킹이 되는 경우 함수는  별다른 추가 코드 작성 없이 공유된다.

아래 코드를 예시로 보자

main.c

int main()
{
	Hyndrome();
	return 0;
}

hyndrome.c

#include <stdio.h>

void Hyndrome()
{
	printf("I am HYndrome\n");
}

 

하지만 변수는 공유되지 않는다.

extern

extern 키워드를 사용하면 변수도 공유할 수 있다.

아래 예시를 보자

main.c

#include <stdio.h>

extern int a = 1;

int main() {
	printf("main1 %d\n", a);
	Hyndrome();
	printf("main2 %d\n", a);
	return 0;
}

hyndrome.c

#include <stdio.h>
int a;
void Hyndrome() {
	//main.c 에서 extern 된 a 값 출력
	printf("Hyndrome1 %d\n", a);
	a = 2;
	printf("Hyndrome2 %d\n", a);
}

활용

header에 extern 변수를 사용하는 경우 

#include만 하면, 누구나 쓸 수 있는 전역 변수가 된다

common.h

#ifndef COMMON_H
#define COMMON_H

extern int globalVariable;

#endif

소스 파일에 extern 변수를 사용하는 경우

내부적으로 전역 변수를 사용할 때 사용

#include "common.h"

void function1()
{
	extern int globalVariable;
}

Static

static은 다양한 곳에 쓰인다.

함수 내 지역 변수 앞 : 전역 변수화

프로그램이 종료될 때까지 변수의 값이 유지되지만 해당 함수 내부에서만 접근이 가능함

#include <stdio.h>

void function1()
{
	static int var1 = 0;
	for (int i = 0; i < 5; i++)
	{
		printf("function1: %d\n", var1++);
	}
}

int main()
{
	function1();
	function1();
	// printf("result : %d\n", var1); 불가능: var는 function1 내부에서만 접근 가능

	return 0;
}

전역 변수 앞 : 다른 소스 파일에서 공유 불가 ( static > extern)

파일 내부에서만 접근할 수 있는 파일 범위(File scope)를 가지게 된다.

다른 파일에서 전역 변수 이름이 충돌하지 않도록 보호한다.

static은 extern 보다 우선 순위를 가진다.

'C language' 카테고리의 다른 글

함수포인터  (0) 2024.12.14
변수 키워드 const, volatile  (1) 2024.12.14
전처리지시문, Header Guard  (1) 2024.12.14
c 구조체, 유니온, typedef, 패딩, 비트필드  (0) 2024.12.13
고정길이 정수 - stdint.h  (0) 2024.12.13

+ Recent posts