.o또는 .obj 1개가 생긴다.C/C++에서는 변수나 함수를 사용하기 전에 반드시 선언declaration하고 정의definition해야 한다.
요약하자면, 선언은 어떤 개념에 대한 언급reference이고 정의는 그 개념의 본체라고 할 수 있다. 정의는 언제나 선언이지만 그 역은 항상 참인 것은 아니다. C/C++에서 정의가 아닌 순수한 선언이 존재한다.
// foo.cpp
// 함수 max()의 정의
int max(int a, int b)
{
return (a > b) ? a : b;
}
// 함수 min()의 정의
int min(int a, int b)
{
return (a <= b) ? a : b;
}
정의가 아닌 선언으로 함수를 표현하면 다른 번역 단위에서 참조하거나 같은 번역 단위에서 나중에 사용할 수 있다. 함수 서명 후에 세미콜론을 붙이면 선언이 되는데, 이때 extern 키워드를 앞에 붙일 수도 있다.
// foo.h
extern int max(int a, int b); // 함수 선언
int min(int a, int b); // 마찬가지로 선언이다.
// extern은 붙이지 않았지만 있는것으로 가정한다.
변수나 구조체(클래스)의 인스턴스를 정의할 때는 데이터의 타입 바로 뒤에 이름을 쓰면 되고 배열을 선언하는 경우는 대괄호를 붙인다.
// foo.cpp
// 전부 변수 정의다.
U32 gGlobalInteger = 5;
F32 gGlobalFloatArray[16];
MyClass gGlobalInstance;
다른 번역 단위에서 정의된 전역 변수를 사용할 때는 현재 번역 단위에서 extern 키워드를 앞에 붙여 선언하면 된다.
// foo.h
// 전부 정의가 아닌 선언이다.
extern U32 gGlobalInteger;
extern F32 gGlobalFloatArray[16];
extern MyClass gGlobalInstance;
// foo.h
// 이 함수는 올바른 인라인 함수다.
inline int max(int a, int b)
{
return (a > b) ? a : b;
}
// 이 함수는 인라인 함수가 될 수 없는데
// 컴파일러가 함수 구현을 볼 수 없기 때문이다.
inline int min(int a, int b);
// foo.cpp
// min() 함수의 구현은 컴파일러에게 '감춰진' 거나 다름없기 때문에
// 이 함수는 foo.cpp 안에서만 인라인으로 처리될 수 있다.
int min(int a, int b)
{
return (a <= b) ? a : b;
}
인라인 키워드는 컴파일러에게는 참조해야 할 힌트일 뿐이다. 컴파일러는 각 인라인 함수에 대해 함수 크기와 인라인화했을 때 얻을 수 있는 효율성 등을 감안해 분석한 후 정말 인라인으로 처리할지 결정한다. 프로그래머가 컴파일러에게 인라인 함수를 만들라고 강제할 수 있는 __forceinline 같은 키워드를 지원하는 컴파일러도 있다.