Powerful Programming Language C++
이번 시간에 알아보고자 하는 키워드는 extern과 volatile입니다! 우선 extern부터 알아볼 예정입니다. 만약 프로젝트를 진행하는 과정 중에 사용해야 되는 변수가 겹치는 경우가 존재합니다. 예를 들어, 전역적으로 사용하는 정적 변수와 같은 경우엔 더더욱 이러한 부분들을 확실히 확인할 수 있습니다. 똑같은 변수를 선언하다 보면, 혹시나 이름이 꼬이거나 프로젝트의 일부 파트에서 사용해야 되는 함수나 변수 같은 경우에 중복적으로 선언하게 될 시 절대 클린 코드라고 볼 수 없게 됩니다. 이때 사용하는 키워드가 바로 extern키워드입니다. 즉, 다른 소스파일에 선언되어있는 변수나 함수 같은 것들을 현재 동작중인 소스파일에 결합해 사용하고자 하는 개념인데요, 어려울 것 없습니다. 아래 코드를 보면서 비교를 해보도록 하겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
|
//link.cpp
#include <iostream>
static int GlobalNum = 512;
static int GlobalPrint(){
printf("GlobalNum : %d\n", GlobalNum);
GlobalNum += 1000;
printf("GlobalNum + 1000 : %d\n", GlobalNum);
return 1;
}
|
cs |
우선 link.cpp이란 파일을 같은 디렉토리내에서 생성해주신 다음 위와 같이 코드를 작성해주세요!! 그리고 아래 코드와 같이 main.cpp이란 파일을 생성하고 코드를 작성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//main.cpp
#include <iostream>
#include "link.cc"
extern int GlobalNum;
extern int GlobalPrint();
int
main(int argc, char *argv[])
{
GlobalPrint();
return 0;
}
|
cs |
link.cpp에 있는 변수와 함수를 모두 extern으로 받아왔기 때문에 다른 소스파일과 같이 위의 변수와 함수를 공유하면서 사용할 수 있게 됩니다. 물론 전역 변수로 선언해도 다른 소스파일에서 사용할 수 있지만, extern은 현재 사용되고 있는 변수나 함수들이 외부에 있다는 것을 표시한다라고 생각하시면 됩니다. 만약 외부 소스코드에서 사용해야 할 전역 변수 함수가 있다면 extern키워드를 통해 컴파일러와 같이 프로젝트를 진행하고 있는 개발자들에게 외부에 있다고 알리는 것이 이상적인 코드 작성이 되겠습니다.
Volatile
C/C++을 이용해 프로젝트를 진행해보시지 않았거나, 특히 임베디드 영역에서 사용하지 않았다면 위와 같은 키워드를 만나보긴 힘들 지 않을까 생각이 듭니다. 우선 volatile키워드는 심도 깊은 이해를 요구하는 키워드입니다. volatile로 선언된 키워드는 컴파일러가 최적화를 적용하지 않게 한다는 의미가 존재합니다. 그만큼 컴파일러의 개입을 막는다는 의미로 사용되지요, 개발자가 작성한 volatile키워드는 온전히 컴파일 되게 됩니다. 컴파일러는 속도와 유지보수를 위해서 항상 사용자의 고급언어를 1차원적인 방식으로 기계 언어와 사상시키지 않습니다. 컴파일러가 최적화할 수 있는 코드는 강제적으로 최적화를 진행하지만, volatile키워드만큼은 예외입니다. 주로 하드웨어(메모리:MMIO)와의 액세스를 위해서 지정한 주소에 사상되어, 직접 액세스 하는 방식으로 많이 사용되며 동시에 값이 유동적으로 변할 수 있다는 것을 의미합니다. 때문에 컴파일러의 예외적인 최적화는 배재됩니다! 특히 메모리와 프로세스 영역에서 가장 많이 사용되는 키워드입니다!! 설명이 많이 어렵지만, 차근차근 읽어주시길 바랍니다! 사용방법은 const와 비슷합니다.
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
|
#include <iostream>
void foo(int volatile&){}
void bar(int &){}
void boo(const int&){}
int
main(int argc, char *argv[])
{
int volatile num1 = 10;
const int num3 = 30;
int num2 = 20;
foo(num1);
foo(num2);
//bar(num3); <-- compile error because const type is not a int subtype
//bar(num1); <-- compile error because volatile type is not a int subtype
bar(num2);
//but int is subtype of volatile and const
boo(num3);
return 0;
}
|
cs |
volatile & const는 int를 서브타입으로 가질 수 있기 때문에 함수의 인자로 volatile & const로 선언해도 int는 서브타입이기 때문에 문제없이 컴파일이 가능합니다. 사실상 volatile을 최대한 사용하는 예제를 보여드리려 하면, 멀티스레딩 개념을 가져와서 설명해야하기 때문에 현재는 어려운 개념까진 설명하지 않도록 하겠습니다만, 시일 내에 멀티스레딩과 병렬 프로그래밍에 대해서도 올릴 예정이기 때문에 들어오셔서 보면 될 것 같습니다. volatile키워드는 항상 메모리에만 액세스 한다는 점만 기억해두시면 될 것 같습니다. 레지스터를 통해서 액세스 하는 것이 아닌 메모리로의 직접적인 사상을 하게 뜸한 키워드이며, 컴파일러의 최적화를 거부하는 키워드라고 보는 것이 맞습니다!!
이상입니다! 잘 보셨다면 공감하트남겨주시면 감사하겠습니다!!
댓글로 피드백, 문의, 질문 모두 환영합니다!!
감사합니다😊😊😊😊😊😊😊
'C++' 카테고리의 다른 글
[C++]C++의 제네릭, Template class에 대해서 (0) | 2021.02.17 |
---|---|
[C++] static, const, explicit 제대로 알고 사용하기![2] (0) | 2020.12.19 |
[C++] static, const, explicit 제대로 알고 사용하기![1] (0) | 2020.12.18 |
C++로 구현하는 자료구조!!이중연결리스트(Doubly Linked List)@@ (1) | 2020.11.30 |
C++로 구현하는 자료구조!!!트리자료구조(Tree)@@ (1) | 2020.11.29 |
댓글