2009. 4. 14. 14:36

default argument promotion

 기본 인자 진급( default argument promotion )은 함수 호출이 원형 선언의 지배를 받지 않거나 원형선언이
보이더라도 가변 인자를 갖는 경우, 인자에 적용되는 일정한 변환 규칙이다.
 1. int 보다 작은 정수 타입은 int형으로 변환.
 2. float형은 double형으로 변환.
 3. 나머지 인자는 그대로 전달.

즉 함수의 리턴 타입과 모든 파라메터 타입은 int, double형으로 쓴다는 의미이다.

원형 선언은 인자와 매개변수의 데이터형이 무엇이든지 간에 대입에 의한 암시적 변환이 허락되는 관계라면
마치 매개변수로의 대입이 일어나는 것처럼 적절한 변환 과정으로 수행해준다. 따라서 그만큼 인자와 매개변수의
데이터형에 관심을 덜 써도 프로그램은 정의된 행동을 보장받는다.

하지만 비원형 선언( 오래된 형식의 선언 방법 - 설명1 참조 )아래에서 이루어지는 함수 호출이나 원형선언이라도
가변 인자를 갖는 경우에는, 인자와 매개변수의 데이터형이 상충되지 않도록 보장하는 것은 어디까지나 
프로그래머의 책임이다. 
따라서 default argument promotion의 진정한 존재 이유사 기존 구현의 하위 호환성을 유지하는 것이라 하지라도
분명 비원형 함수 호출에서 프로그래머는 더 적은 수의 데이터형만 걱정하면 되므로 프로그래머의 부담을 덜어주는 긍적적인 역활을 한다고 볼 수도 있다.( 호환성 측면에서의 인자값 부담 )


< 설명 1 >
1)

int func(x)
float x;
{ ...

표준화 이전의 비원형함수 정의 방법이다. 소괄호안에는 파라메터의 변수명이 나오고 아래 따로 선언이 된 방식이다. 만일 선언이 되지 않는 경우 자동으로 int로 간주하게 된다.

2)

extern int func();

여기서 짚고 갈 점은 ()는 매개변수가 없다는 것이 아니라 매개변수에 대한 검사를 수행하지 않는 다는 의미이다.
즉 비원형 함수이며 매개변수가 없음을 의미하는 원형 선언은

extern int func(void);

이다.

다시 정리하자면

func(10, 20); 
func(10); 

위의 두 함수는
extern int func()와 같은 함수를 뜻한다는 것이다.

<의문점>

옜날 형식의 함수와 요즘 함수를 섞어서 썼을 때

extern int func(float);

int func(x)
float x;
{ ...

이렇게 쓰면 에러가 나므로

extern int func(double);

또는

int func(float x) { ... }
 
요렇게 써야 할 것이다.
만일

extern int func();

int func(x)
float x;
{ ...

이렇게 쓴다면?? 안되남??