1. C 언어의 표준에 관심이 부족한 이유
C언어를 기반으로 프로그램을 개발하는 프로그래머라고 하면 C++ 언어도 같이 사용하는 경우가 많다. 그래서 표준 C언어만으로 프로그램을 개발하는 경우가 거의 없다.
왜냐하면 C언어 표준 문법은 C++문법에 대부분 포함되어 있다. 그냥 C++ 컴파일러를 사용하면 컴파일이 잘 되고 더 많은 부분까지 허용해준다.
예를 들면, C++의 컴파일러는 .c 이면 C언어 형식으로 컴파일하고 .cpp이면 C++언어 형식으로 컴파일 하도록 기본 옵션이 설정되어 있다. 그런데 개발 도구가 프로젝트를 만들어줄 때 대부분 .cpp로 기본 파일을 만들어 주기 때문에 C++ 언어를 기준으로 컴파일하는 경우가 많다. 그래서 C언어를 공부하는 사람도 자신이 만든 C언어 예제가 C++ 형식으로 컴파일 되는지도 모르고 컴파일 하는 경우가 있다. 확장자를 .c 또는 .cpp로 했을 때 무슨 차이가 있는지도 모르는 사람도 많다.
2. 현재까지 나온 표준들에 대한 요약
[ C89 / C90 ]
1989년과 1990년에 나온 표준안
[ C99 ]
1999년에 나온 표준안
C++에서 사용 가능하던 Single line comment ( // ) 사용 가능
변수 선언은 더 이상 함수나 복합 명령어의 시작 부분에 사용할 필요가 없음
complex와 같은 새로운 자료형 도입
generic 수학 함수 추가
가변 인수 매크로 도입
restrict 키워드 도입
가변 길이 배열 사용
[ C11 ]
2011년에 나온 표준안
정렬 기능 추가
_Noreturn 키워드 추가
매크로 함수에 _Generic 키워드 사용할 수 있도록 추가
멀티 스레드 지원 ( threads.h )
유니코드 지원 개선
gets 함수를 표준에서 제거하고 gets_s 함수를 표준에 편입
fopen 함수에 배타적 파일 생성 모드인 "x"플래그 사용 가능
exit 함수와 별개로 quick_exit 함수 추가
복소수 관련 매크로 추가
3. ANSI C 기준의 main 함수 선언하기
/* 실행 인자 없는 경우 */
int main (void)
{
return 0;
}
/* 실행 인자 있는 경우 */
int main (int argc, char argv[ ])
{
return 0;
}
특별한 경우가 아니라면 main 함수의 반환 값을 받아서 사용하는 경우가 거의 없기 때문에 main 함수의 return문을 생략할 수 있다. 그런 이유로 Visual C++ 계열에서는 아래와 값이 main 함수를 많이 사용한다. 하지만 이것은 표준 형식이 아니라 모든 컴파일러가 제공하는 형식은 아니다. 예를 들어, 리눅스의 gcc나 cc 같은 컴파일러는 아래와 같이 사용하면 컴파일 오류가 발생하기도 한다.
/* 실행 인자와 반환 값이 없는 경우 */
void main( )
{
}
4. 변수 선언 방식의 변화
C 언어가 C++ 언어에 비해서 가장 불편했던 것 중 하나는 변수 선언을 함수나 복합 명령문의 시작 부분에만 가능했다는 점이다. 즉 C99 이전의 표준안에서는 아래와 같이 변수를 선언하면 컴파일할 때 오류가 발생했다.
#include <stdio.h>
int main(void)
{
printf("abc");
int data = 0; // 오류 발생! 명령문 호출 전 변수 선언이 되어야 함
return 0;
}
위 예제를 컴파일하면 아래와 같은 오류가 발생한다.
error C2143 : syntax error : missing ';' before 'type'
그래서 이런 오류를 피하려고 printf 함수 위쪽으로 변수 선언을 옮기거나 다음과 같이 복합 명령문을 사용해야 했다.
#include <stdio.h>
int main(void)
{
printf("abc");
{
int data = 0;
}
return 0;
}
사실 C99 표준안에서 C++와 동일하게 변수 선언할 수 있도록 변경되어 이제는 이런 오류가 발생하지 않는다. 하지만 C99 표준안이 VS2013에서부터 적용되어 아직도 그 이하 버전을 사용하는 프로그래머라면 C언어 변수 선언이 C++처럼 가능한지 모르고 있을 수 있다.
5. 주석 (comment)의 변화
C언어에도 C99 표준안부터 C++처럼 '//' 주석을 사용할 수 있도록 변경되었다. 그런데 Visual C++의 경우 '//' 주석이 얼마나 프로그래머에게 편한지 알고 있어, C99 표준안이 나오기 전부터 Visual C에서 사용이 가능했다. 그러다 보니 C99 표준안에 포함되어 이제 표준 C 언어에서 사용이 가능하다는 것을 모르고 Visual C++에서 비표준으로 제공하고 있다고 생각하는 프로그래머도 많다.
참조 C 언어의 표준에 대한 이야기 - 1 : 네이버 블로그 (naver.com)