어차피 char로 해석하게 되는데 매개변수가 int인 알쏭달쏭한 함수들(memset()
, memchr()
….etc)이 Libft 과제에 나온다.
int func(); /* 매개변수 목록 없음*/
과 같은 꼴로 간주되며(implicit declaration, 암묵적 선언) 그러한 함수들에 전달되는 각 인자들은 default argument promotion이라는 과정을 거치게 된다.
char
데이터를 전달하려고 시도하면 int
로 promoted되어서 전달된다.int
가 되어야했다.memset()
과 같은 함수들에 대해 int 대신 char를 받도록 ‘수정할 수 있긴’하다.
그렇지만 그렇게 하기 위해선 높은 비용이 들것이고 또 코드를 수정함으로써 얻는 이익이 거의 없기 때문에 굳이 수정하지 않고 있다.… 이 기능은 최신 C언어 표준(C99 등)에서는 빠진 것으로 알고 있습니다. 함수를 호출하려면 반드시 그 전에 선언하라는 거죠. 예전에는 함수 선언이 없었어도 컴파일러가 대충 찍어서 넘겨줬지만, 그에 따른 득(=프로그래머가 코딩할 때 약간 덜 귀찮음)보다는 실(=미정의 동작에 빠진 프로그램을 디버깅하는데 들어가는 상당한 노력)이 더 크다는 겁니다. …
int func(); /* 매개변수 목록 없음*/
과 같은 꼴로 간주되었으며 그러한 함수들에 전달되는 각 인자들은 default argument promotion을 거치게된다.implicit declaration of function
가 바로 이것이다!!!<aside> 💡 default argument promotion (기본 인자 승격) 함수 호출이 원형 선언의 지배를 받지 않는 경우(implicit declaration 등), 혹은 원형 선언이 보이더라도 가변 인자를 갖는 경우, 인자(argument)에 적용되는 일정한 변환 규칙이다.
</aside>
→ 인자와 매개변수의 데이터형에 관심을 덜 써도 정의된 행동을 보장받을 수 있도록한다. (즉 프로그래머가 코드 작성할 때 쫌 편해짐)
int 보다 작은 정수 타입은 int형으로 변환한다.
float형은 double형으로 변환한다.
나머지 인자는 그대로 전달한다.
(즉 함수의 return 및 parameter의 타입을 모두 int, double형으로 변환)
Why does the function memchr()
use int
for the argument of char
type?