-
정의 vs 선언 2프로그래밍 언어 C, C++ 2021. 1. 16. 02:17728x90
내용을 이어간다.
A.h
1234#pragma onceextern int number;cs #pragma once 라는 매크로가 보일것인데, 중복으로 include되는 것을 막는 매크로이다.
아래에 있는것과 동일하다. 간단하게 설명하면
_A가 정의되어 있으면, 포함시키지 않는다.
_A가 정의되어 있지 않으면, _A를 정의하고 해당 파일 내용을 포함시킨다.
1234567#ifndef _A#define _Aextern int number;#endif// _A endcs A.cpp
1234#include "A.h"int number = 1004;cs Main.cpp
123456789#include "A.h"int main(){printf("number = %d\n", number);return 0;}cs A.h파일을 포함했으니, 어딘가에 number라는 변수가 어딘가에 선언되었다고 컴파일러에게 알렸으며,
실제로 실행을 해보면 number = 1004 라고 잘 출력 될것이다.
이번에는
A.cpp 를 이렇게 수정해보자.
1234#include "A.h"//int number = 1004;cs 컴파일러가 A.cpp 와 Main.cpp 를 각각 컴파일을 성공해서 오브젝트 파일인 A.obj, Main.obj를 성공적으로 만들었을것이다. 보통 여기서 일어나는 문제들은 대부분 문법상 문제(syntax error)일 것이다.
컴파일 결과물인 A.obj, Main.obj를 재료로 실행파일을 만들려고 할때,(링크 과정이라 한다.)
어딘가에 존재해야 할 number라는 변수가 없으니 실행파일을 만드는데 실패하게 되고 에러를 알려준다.
이것을 링크에러~라고 한다.
컴파일과 링크를 합쳐서 부르는 말을 빌드라고 한다.
그럼...
B.cpp 를 작성하자.
123int number = 5004;cs 빌드를 해보면 성공할 것이고,
실행을 해보면 number = 5004 라고 잘 출력 될것이다.
extern 으로 선언된것은 어디에 있든 컴파일하는 모든 파일중에 존재하기만 하면 된다.
확실히 감 잡았을거라 생각한다.
그럼 이번에는
A.cpp 수정
1234#include "A.h"static int number = 1004;cs B.cpp 수정
1234#include "A.h"int number = 5004;cs 빌드 후, 실행하면?
number = 5004 라고 출력한다.
A.cpp와 B.cpp둘다 number라는 변수를 선언을 했지만, 용도가 다르다.
A.cpp에서 선언한것은 static을 붙여서 A.cpp파일내에서만 사용했고
B.cpp에 선언한 number는 B.cpp 내부 외부에서 모두 사용할수 있도록 선언한것이다.
static 키워드는 해당 외부에 알려지기를 막는 역할을 한다. 그리고 같은 변수명 중복에러를 막는데도 사용된다.
static과 extern은 이 외에도 여러 용도가 있으니 따로 빼서 익히기를 추천한다.
'프로그래밍 언어 C, C++' 카테고리의 다른 글
문자열 처리 - 한글 개념 (0) 2021.01.22 랜덤함수 (0) 2021.01.17 정의 vs 선언 1 (0) 2021.01.16 프로그래머 워밍업 2 (0) 2021.01.09 프로그래머 워밍업 1 (0) 2021.01.07