'c'에 해당되는 글 4건

  1. 2012.02.19 C의 역사
  2. 2012.02.04 enum 타입 c vs c++
  3. 2012.01.30 system vs exec
  4. 2011.11.09 전처리기 (1)
프로그래밍/C2012. 2. 19. 14:28
출처: secure coding in c and c++

C언어의 아버지 데니스 리치는 The Second History of Programming Language 컨퍼런스에서 C언어의 개발을 발표하였고, 1970년 초반  UNIX 오퍼레이팅 시스템에서의 시스템 구현 언어로서의 역활을 하기 위해 만들어 졌다.  C는 typeless 언어 B에서 파생되었으며, B언어 또한 BCPL이라는 언어에서 파생되었다.  BCPL은 1960 년대 마틴 리차드가 설계했으며 1920년 초반 여러 프로젝트에서 사용되었다. B는 type이 없는 C, 혹은 더 정확하게 말하자면, 메모리에 8K 바이트로 압축된 BCPL이라고 할 수 있겠다.


그 후,  1978년에 "K&R"이라고 자주 불리우는 'The C Programming Language'이  출판되었다.  이 시점의 C언어에 있었던 많은 변화들은 interdata 8/32라는 컴퓨터로 코드를 포팅하는 과정에서 생겨났으며 이 당시 C는 여전히 typeless라는 성격을 강하게 지니고 있었다.  


1983년 ANSI는 X3J11위원회를 설립했다. ANSI의 목표[ANSI 89]는 "명확하고, 일관되었으며, 모호하지 않는 C의 스탠다드를 만들어 C언어 환경안에서 사용자 프로그램의 portability 를 지원하고, 일반적인, 기존에 이미 존재하는 C의 정의를 코드화"하는 것이었다.  1989 년 말에 X3J11은 [ANSI 89]라는 리포트를 만들어 냈으며 이는 이후 ISO / IEC 9899-1990로 ISO에 의해 승인되었다.   물론, ANSI 표준의 섹션의 재배치가 있었고 ISO표준에서는 조항이 되었다고 하나 이 둘 사이의 기술적인 차이는 없다.  이 표준은 두 형태로, 일반적으로 C89와 같은, 또는 간혹 C90로 알려져 있다.


이 스탠다드는 우리가 흔히 아는 C89가 되었다.(혹은 승인 기준으로 C90이라고 불리우기도 한다.)  

후일 이 스탠다드의 첫번째 에디션은 수정을 거쳐 AMD1:1995가 되었다.(이 또한 C95라고 알려졌다)

이 또한 계속적인 수정( ISO/IEC 9899 )으로  인해 우리가 흔히 알고 있는 C99가 되었다.

'프로그래밍 > C' 카테고리의 다른 글

exit(1) vs exit(EXIT_FAILURE)  (0) 2012.02.29
file에서 읽어와 strtok을 이용해 struct에 저장하기  (2) 2012.02.28
enum vs #define vs const  (0) 2012.02.05
enum 타입 c vs c++  (0) 2012.02.04
system vs exec  (0) 2012.01.30
Posted by code cat
프로그래밍/C2012. 2. 4. 14:58



라고 enum 타입을 정의 했다고 치자.
그렇다면 이 enum 타입을 리턴하는 함수는 어떻게 정의 할까? c++ 라면 Food라고 해 줄 수 있지만, c에서는 아쉽게도 다음과 같이 써 줘야 한다.



이렇게 하는게 싫다면 typedef 으로 정의해 주면 된다.


'프로그래밍 > C' 카테고리의 다른 글

C의 역사  (0) 2012.02.19
enum vs #define vs const  (0) 2012.02.05
system vs exec  (0) 2012.01.30
process & signal  (0) 2012.01.25
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
Posted by code cat
프로그래밍/C2012. 1. 30. 08:07

system 으로 쉘 명령어를 실행시키거나 프로세스를 실행시키는건 대체적으로 좋지 않은 방법이다. 

이는 system 이 동작하기 위해 먼저 쉘을 실행시키기 때문이다. 이렇게 시작된 쉘은 각 설치된 쉘의 환경등에 따라 다른 동작성을 보일 수 있기 때문이다. 


그래서 보통 대체적으로 쓰이는 것이, exec 이며 exec 계열은 다음과 같이 나뉘어진다. 
execl, execle, execlp
execv, execve, execvp

그러나 이런 exec 또한 프로세스를 실행시킨 뒤 에러가 나지 않는 한 리턴되지 않는다.

즉,우리가 처음 시작한 프로세스에서 여러개의 프로세스를 실행시키기에는 부적합하다는 것이다. 


그래서 대신 자식 프로세스를 생성하거나 쓰레드를 생성하는 것이다

'프로그래밍 > C' 카테고리의 다른 글

enum vs #define vs const  (0) 2012.02.05
enum 타입 c vs c++  (0) 2012.02.04
process & signal  (0) 2012.01.25
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
대상체의 기억수명  (0) 2011.11.29
Posted by code cat
프로그래밍/C2011. 11. 9. 10:26

출처: C 언어 펀더멘탈, 전웅 저, 한빛미디어

#define int2hex(n) ((int)"0123456789ABCDEF"[(int)(n)])


int (int2hex)(int n)

{

    return "012345678ABCDEF"[n];

}


(int2hex)를 괄호로 둘러쌓아, 만일

int int2hex(int n)

으로 함수를 정의했을 때 매크로로 확장되는 걸 방지 할 수 있다.  함수의 주소를 취할 때도 함수명만 사용하거나 함수명에 번지 연산자를  붙인 형태를 사용하기 때문에 전처리 과정에서 매크로로 확장되지 않는다.

만약 필요에 따라 매크로가 아닌 실제 함수를 호출하고 싶다면, #undef 지시자를 사용하거나 다음과 같은 형태의 함수 호출 수식을 사용할 수 있다.

(int2hex)(12);


한편 매크로 함수를 사용하는 또 다른 경우는, 이미 구현되어 있는 함수에서 일정 개수의 인자를 특정 값으로 고정해 사용하는 경우이다.  특히 이는 라이브러리를 구현할 때 많이 사용하는 방법이다.  예를 들어 line()이라는 함수가 구현되어 있다고 하자.

#define line_h(x, y, len, c, s) (line((x),(y),(x)+(len)-1, (y),(c),(s)))

#define line_v(x, y, len, c, s) (line((x),(y),(x),(y)+(len)-1,(c),(s)))

등으로 간단히 매크로로 대체할 수 있다.


여러 수식을 하나의 수식으로 만들어 매크로 함수에 담는 것은 쉼표 연산자를 사용하면 간단하다.  특히 쉼표 연산자는 피연산자로 주어진 수식 사이에서 평가순서와 시퀀스 포인트를 보장해 주기 때문에 연속적인 수식문과 동일하게 사용된다.

#define func_seq() (func1(a,b,c,d),\

    func2(a,b,c,d),\

    func3(a,b,c,d))


매크로 함수 사용시에 세미콜론의 사용여부를 다음과 같이 간단히 처리 할 수 있다.

#define SMT(test, ret) \

    do{                       \

     if(!(test)){             \

        set_error(SMT_ERROR); \

        return ret;

    }

}while(0)

Posted by code cat