선언과 정의는 비슷한 의미 같지만 함수나 변수등에서 사용되면 그 의미는 달라진다.
선언(Declartion) : 컴파일러에게 대상에 대한 정보를 알린다. 함수가 어떤 인수들을 전달받으며
어떤 타입을 리턴하는지를 알리는 원형 선언(프로토타입)이 대표적인 선언이다. 컴파일러에게 정보만 제공하는
것이므로 본체를 가지지 않으며 실제 코드를 생성하지도 않는다. 그래서 다음처럼 여러번 중복되어도 상관없다.
int MAX(int a, int b);
int MAX(int a, int b);
정의(Definition) : 대상에 대한 정보로부터 대상을 만든다. int i; 정의문에 의해 4바이트를 할당하며
int Max(int, int){ } 정의로부터 함수의 본체를 컴파일하여 코드를 생성한다. 정의는 변수의 타입, 함수의
인수목록을 컴파일러에게 알려 주기도 하므로 항상 선언을 겸한다.
선언 역할-알린다, 메모리-사용안함, 정보의 완전성-불완전해도 됨, 중복가능석-가능
정의 역할-생성한다, 메모리-할당, 정보의 완전성-항상 완전해야 됨, 중복가능성-불가능
하지만 실제로는 별 구분없이 사용되고 있다. 따라서 이러한 명칭적 정의가 있다는 것만 알고 있자..
#define A 1000 // 보통 디파인한다.정의한다로 하지만 메모리 할당을 받지 않으므로 선언이다.
int i; // 인트형을 선언한다 이런 말을 많이 쓰지만 메모리를 잡아 먹으므로 정의이다.
extern int j; // 외부 함수(모듈)에 정의된 int형을 선언하는거라고 해야 정확한 표현(?) 이다.