C 프로그래밍 언어에는 개발 커뮤니티가 정의한 표준이 존재합니다. 이는 컴파일러가 프로그램을 이상적으로 컴파일해야 하는 방식을 규정한 것으로, 모든 개발자가 따라야 할 공통된 기준입니다.
쉬운 예를 통해 설명해 보겠습니다. 여러분이라면 한 번쯤 마주쳤을 법한 흔한 C 프로그램 사례입니다. 문제가 있다는 것은 눈치챘지만, 그 원인까지 깊이 파고들지는 않았을 수도 있습니다.
main() 함수의 void 반환 타입 문제
다음 프로그램을 살펴보겠습니다.
void main() {
// 프로그램 코드
}
이 프로그램은 Turbo C 컴파일러에서는 아무 문제 없이 실행되지만, 다른 대부분의 컴파일러에서는 "main 함수는 void 타입일 수 없다"는 오류를 발생시킵니다. 그렇다면 어느 쪽이 옳은 걸까요? 그 답은 바로 C 표준에 명시되어 있습니다.
C 프로그래밍 언어 표준이란?
C 표준은 컴파일러 제작자들이 코드를 어떻게 해석하고 컴파일해야 하는지에 대한 표준적인 지침입니다. 가장 최근의 C 표준은 2018년 6월에 발표된 ISO/IEC 9899:2018로, 흔히 C18(또는 C17)이라고 부릅니다.
이 표준은 프로그램의 동작 방식 전반을 규정합니다. 즉, 프로그램이 이상적으로 어떻게 실행되어야 하는가? 내장 함수들의 올바른 정의와 사용 방법은 무엇인가?와 같은 질문에 대한 공식적인 답을 제공합니다.
main() 함수를 예로 들어 보겠습니다. 표준에 따르면 main() 함수는 0개 또는 2개의 매개변수를 가져야 하며, 반환 타입은 반드시 int로 선언하는 것이 올바른 방식입니다.
표준에 맞는 main() 함수 문법
// 매개변수가 없는 경우
int main() {
/* 코드 */
}
// 매개변수가 두 개인 경우
int main(int argc, char *argv[]) {
/* 코드 */
}
이처럼 main() 함수를 int 반환 타입으로 선언하면 어떤 컴파일러를 사용하더라도 표준을 준수하는 코드가 됩니다. 또한 프로그램이 정상적으로 종료되었음을 운영체제에 알리기 위해 return 0; 문을 함께 사용하는 것이 좋은 습관입니다.
프로그래밍에는 이 외에도 수많은 표준이 있으며, 안타깝게도 일부 컴파일러는 이러한 표준을 위반하는 동작을 허용하기도 합니다. 따라서 다양한 환경에서 문제없이 동작하는 이식성 높은 코드를 작성하려면 항상 공식 표준을 준수하는 것이 중요합니다.