원형 선언/정의 이전에 있었던 비원형 선언/정의에 대해 다룬다.
결론부터 말하면 비원형 선언은 구식 기술이기 때문에, 무조건 원형 선언을 사용할 것을 권장한다.
🏷️원형과 비원형의 선언/정의
📌원형 선언/정의 (prototype declaration/definition)
- 매개변수에 대한 정보가 주어지는 선언과 정의다.
- 매개변수에 대한 정보란 매개변수 타입과 개수를 의미한다.
📌비원형 선언/정의 (non-prototype declaration/definition)
- 매개변수 타입에 대한 정보가 주어지지 않는 선언과 정의다.
- 구식 기술이기에 앞으로는 사용하지 않는 것을 권장한다.
🏷️비원형의 구조
📌비원형 선언
int func();
- 매개변수에 대한 정보를 일체 주지 않는 것이기에 언제나 빈괄호 형태다.
- 원형 선언이라면 반드시
void
키워드를 넣어주어 매개변수에 대한 정보를 줘야 한다.
📌비원형 정의
- 명칭 리스트에 존재하는 명칭이 선언 리스트에서 선언되지 않으면,
int
형으로 간주된다.
- 비원형 정의는 비원형 선언을 동반하기에 선언 리스트가 있을지라도, 제대로된 인자 검사나 형변환을 수행하지 않는다.
🏷️형 지정자(type specifier, return type)에 대한 규칙
- 원형/비원형 방식과 무관하게 선언과 정의에 따라 생략 여부가 결정된다.
📌함수 선언
- 형지정자를 생략할 수 없다.
func (int, double);
func ();
📌함수 정의
- 형지정자를 생략할 수 있다.
- 이때 형지정자를 생략하면 return타입은
int
형으로 간주된다.func (int a, double b)
{
}
func (a, b)
int a;
double b;
{
}
🏷️()와 (void)
📌비원형 선언
int func();
- 인자를 받지 않는다는 의미가 아니다.
- 단지 매개변수에 대한 정보를 알 수 없기 때문에 비원형선언은 항상
()
형태다.
- 인자에 대한 검사나 형변환을 수행하지 않는다.
📌비원형 정의
int func()
{
}
📌원형 선언
int func(void);
- 인자를 받지 않음을 매개변수 정보(값이 없음을 의미하는
void
타입)를 제공함을 통해 명시하고 있다.
- 함수 선언문에서 인자를 받지 않음을 나타내려면 따라서 원형 선언을 해야한다.
📌원형 정의
int func(void)
{
}
🏷️암시적 선언 (implicit declaration)
- 함수 선언에 관해서만 해당된다.
- 함수 호출이 존재하는 가장 안쪽 블록에,
extern int func();
선언이 존재하는 것처럼 번역한다.
- 즉, return type은 무조건
int
로 가정된다.