C-through - 1. Implicit int rule

목차

1. C-through

C에 관해 복습하면서 알게 되는 점들에 대해 서술하는 시리즈이다. 변수가 무엇이고 상수가 무엇이고 하는 C의 기본적인 문법에 대해서 서술하지는 않는다. 내가 여러 책들을 보고 또 구글링하면서 얻은 추가적인 정보들에 대해서 정리해 놓기 위한 것이다. 글 길이는 너무 길어지는 것은 피하겠지만(만약 쓰다가 너무 길어지면 글 2개로 나누려고 한다) 글마다 담고 있는 정보의 양이 다를 수밖에 없으므로 글 길이는 들쭉날쭉할 것이다.

2. "Implicit int" rule

C언어의 바이블 중 하나라고 꼽히는, 커니핸과 리치가 쓴 The C Programming Language에는 다음과 같은 예제 코드가 나온다. 굉장히 초반에 나오는 코드이다.

 #include <stdio.h>

 main()
 {    
     printf("hello, world\n");
 }
 #include <stdio.h>

 main()
 {    
     printf("hello, world\n");
 }
 #include <stdio.h>

 main()
 {    
     printf("hello, world\n");
 }
 #include <stdio.h>

 main()
 {    
     printf("hello, world\n");
 }

C언어를 조금 배워본 사람이라면 위 코드를 보고 이상하게 여길 것이다. main함수의 반환값 자료형이 없다는 이유에서이다. 심지어 main함수의 리턴값도 없다!

다만 이는 C89표준에서는 문제없이 돌아간다. 그때 당시의 표준에서는 반환값 자료형이 명시되어 있지 않은 함수의 반환형은 암묵적으로 int로 받아들이도록 되어 있었다. 또한 꼭 함수 반환형만이 아니라 선언에서 타입 지정자를 아예 생략할 수도 있었다.

이를 implicit int rule 이나 default to int rule이라고도 했다. 이러한 문법이 있었던 이유는 C언어의 조상격인 언어가 타입이 존재하지 않는 B 언어였으며 C언어의 초기에는 대부분의 코드들이 정수형만 다루었기 때문이다. 따라서 타입을 명시하지 않고도 프로그래머들 사이에서 암묵적으로 모든 것이 int로 통했고, 그래서 타입 지정자를 명시하지 않는 것이 편리함으로 다가오기도 했던 것 같다.

그러나 이 문법은 C99 표준에서부터 폐기되었다. 이 문법이 만들어내는 위험이 편리함보다 더 크다고 위원회에서 판단했기 때문이다. 이 implicit int rule은 C가 타입이 없는 언어에서 강타입 언어로 넘어가는 과도기에 존재했던 문법 정도로 이해하면 될 것 같다. gcc등의 몇몇 컴파일러에서 해당 문법을 여전히 지원하고 위의 프로그램은 여전히 돌아간다. 그러나 이런 예전 코드를 이해하는 것 외에 새로운 C코드 작성시에는 꼭 함수의 반환형을 명시해 주자.

3. 참고

https://stackoverflow.com/questions/8220463/c-function-calls-understanding-the-implicit-int-rule

http://www.open-std.org/jtc1/sc22/wg14/www/docs/text/n661.txt