내가 지금 하려는 말은 "C언어가 BCPL 이라는 언어에서 부터 유래했다"하고 시작하는 C 언어가 만들어진 배경에 대해 설명하려는 것은 아니다. 내가 하고 싶은 말을 더 자세히 설명하면 C언어 표준의 역사에 대해 말하려고 한다.

우리는 평소에 ANSI C 라는 말을 많이 듣는다. ANSI 는 많은 사람이 알다시피 American National Standards Institute (미국 규격 협회) 이다. ANSI C는 그 협에서 제정된 C 표준 규격 같은 것이다. 이 표준은 1898년에 제정되어 ANSI C 또는 C89 라고 부르기도 합니다. 이 규정은 ISO(International Organization for Standardization) 에서 거의 그대로 받아 들어 국제 표준이 되었습니다. 이 걸을 ISO C 라고 부릅니다. 그래서 ANSI C 와 ISO C 는 거의 구분하지 않습니다.

1994년 ANSI C 에 C 언어가 가지고 있는 버그를 고치고, 1995년에 다국어 지원을 첨가하여 C95가 나오게 되었습니다. (이 때 wchar.h 라는 헤더파일이 덧붙여 집니다. C 컴파일러 가지고 있는 사람이 이 헤더파일 있는지 찾아보세요. 제 생각에는 visual C6.0 도움말에 1994-1998 이라고 적힌 것을 보면, visual c6.0 은 C95 까지 지원하는 것 같습니다. )


1999 년 또 한 번의 변경이 있었는데 이를 C99라고 합니다. (Visaul C7.0 에서는 이를 지원하는 것 같습니다. 제가 그 버전 컴파일러가 없어 확실히 모르겠습니다. 요즘 나오는 gcc 도 이 버전을 지원하겠죠. 더군다나 gcc 는 표준을 잘 지킬테니..)


기본 흐름은 ANSI C(ISO C, C89,C99) -> C95 -> C99 정도로 변했습니다.

이 중간중간에 C9x (C99의 기본이 되는 버전) 같은것도 끼어 있었고...


당신의 컴파일러는 어디까지 지원하나요. 해당연도를 보고 어느정도 유추를 하실 수 있을 것 같군요. 어쩌면 ANSI C 로 지원하지 않는 환경에서 꿋꿋이 프로그래밍 하는 사람도 있을 수 있겠고. (임베디드 쪽이나 마이크로프로세스를 직접 다루는 쪽에서는 그럴 수도 있겠죠. 그렇더라도 gcc 크로스 컴파일러를 이용해서 그런 열악한 상황은 빠져 나오는게 좋아보입니다.)

난, 그런 환경에서 일 하는 일이 없기를...


더 자세한 내용은 http://www.woong.org/

이 사이트에서 찾아보세요. 저도 그 사이트 가기 전에는 C 언어에 표준도 변화는 지 전혀 알지 못했던 사람이니까..
gcc 는 gnu C Compiler 의 약자이다. 리눅스의 경우 거의 모든 배포판에서 기본으로 깔려있다.(없는 배포판이 있던가..) Ms-윈도우에서도 Dev-cpp 나 Cygwin 을 통해 사용가능하다. 나는 Dev-cpp 를 사용한다.

기본 컴파일 사용방법은 gcc -c ctest.c -o ctest.exe 처럼 사용하고 옵션과 파일이름을 붙여서 gcc -cctest.c -octest.exe 라고 하는게 정석적인 방법이다. 보통 리눅스에서는 실행파일을 확장자 out 를 많이 주는 것 같다. 리눅스이 경우 확장자가 그렇게 큰 의미 없고, 윈도우의 경우 exe 가 아니면 실행이 불가능하다.


visual C 에는 cl 이라는 컴파일러가 존재한다. 보통 IDE 툴 때문에 존재 자체를 모른느 경우가 많다. 기본으로 깔았다면 C:Program FilesMicrosoft Visual StudioVC98Bin 라는 곳에 위치한다. (난 visual c 6.0 을 사용한다. 다음 버전에서도 cl 이 존재하리라 생각한다. )

cl /help 라고 치면 옵션에 대한 설명이 뜬다.


"C:Program FilesMicrosoft Visual StudioVC98BinCL.EXE "/Tc test.c

라고 치니 컴파일이 되어 exe 파일을 생성한다.


보통, 컴파일 할 때 IDE 툴을 이용하기 마련이다. Dev-cpp 나 Visaul C 모두 project setting 을 할 수 있는 곳이 있다. 이 곳에 모면 복잡한 옵션들이 써 있다. 이 옵션을 바탕으로 IDE 툴은 gcc 나 ml 을 이용해 컴파일 한다.

(쓰고 나서 한참이 지난후 다시 확인 하니, 조금 잘못된 것 같습니다. ml 과 cl 이 같은 것이라 생각했는데,
다른 것 같습니다. 그리고 visual stdio 6.0 에 있는 것은 cl 입니다. 그래서 내용을 조금 고쳤습니다.
버전에 따라서 ml 이 추가 되기도 하는 것 같습니다. )

생기지 않을 곳 같은 곳에 꼭 버그가 있다.

이건 절대 버그가 아니야 하고 믿었던 코드에 버그가 숨어 있다.



스스로 완벽하다고 믿었을 때, 버그가 있다. 자만심은 버그를 낳는다.



가장 간단한 if 문에서 조차 버그가 생길 수 있다.



다음은 내가 다른 사이트에서 적은 글이다.

------------------------------------------------------------------

C 에서 수학과 다른 의미를 가지는 기호가 있죠. 그 중 대표적인게 = , 와 == 입니다. 그래서 둘을 바꾸어 쓰기도 합니다.



#include <stdio.h>
void main(){
int a=1;
if( a= 2) printf( "a 는 2이다 ") ;
a=1;
if( a=! 2 ) printf( "a는 2가 아니다." );
}





이 건 잘못된 코드죠. 의도 한 대로 값이 나오지 않을 것입니다.
첫 번째 if 문은 a =2 라고 의도와 달리 대입연산을 했습니다. 그래서 if(2) 라는 것으로 인식하게 돼죠.
두 번째 if 문은 눈에 잘 안 띠지만 논리적인 버그가 있습니다. 잘 살표보세요.
=! 는 절대 하나의 연산이 아닙니다. 의도한 대로 고치면 != 라는 같지 않다는 하나의 연산을 해주어야 하니다. 따라서 저 식은 if(!2 ) -> if(0) 라는 의도하지 않은 식을 만들어 냅니다.

이를 쉽게 방지하는 방법으로
if( 2==a ) 라고 쓰기도 합니다. 이 경우 if(2 = a ) 라고 잘못사용하게 되면 error 를 유발하여 컴파일러가 알려주게 됩니다.

또, 한가지 방법을 warning 수준을 높이는 방법이 있습니다.
project -> setting 을 선택하면 대화창이 열림
c/c++ 탭에서 Warning Level 을 Level3에서 Level4 로 올리면 이 경우에는 warning 이 if 문에 대해 경고를 해주게 됩니다.

----------------------------------------------------------------



한가지 덧 붙이자면 gcc 에서는 -Wall 이라는 옵션으로 경고 수준을 가장 높이는 방법이 있다.