C언어는 java와 달리 시스템이 가능한 프로그래밍 언어입니다. 시스템 프로그래밍 언어라는 말은 시스템 종속적인 언어라는 뜻이므로 다른 시스템에서는 그 시스템에서 컴파일해도 제대로 동작하지 않을 수 있습니다. C언어 책들에 보면 이식성이 좋은 언어다라고 소개합니다. 사실 대부분은 잘 돌아가서 맞는 말입니다만, 아닌 경우도 있습니다. 하나의 솔루션을 시스템마다 다르게 소스 코딩하면 유지보수가 너무 힘들기 때문에 하나의 소스에 여러시스템에서 실행될 수 있도록 개발자들은 조건부 컴파일을 하도록 여러가지 방법을 사용합니다. 

    예를들면, OS 종류가 다르거나 같은 종류의 OS더라도 32bit/64bit OS이냐에 따라서, CPU 또는 OS가 big endian이냐 little endian 이냐에 따라서 다른 동작을 할 수 있으므로 여러 시스템에 포팅하면서 아래와 같은 #if ~ #endif로 다르게 컴파일 하게 합니다.

물론 C언어 표준은 ANSI-C나 POSIX(Portable Operating System Interface)의 규정에 따라 표준함수 등을 정의하여 컴파일만 다시 하면 실행되도록 노력하였습니다만 완벽하지는 않습니다. 여러 시스템에 정상적으로 동작하게 하려면 이것은 순전히 개발자의 몫입니다.
이를 정상적으로 동작하도록 하기 위해서 사용하는 것이 전처리문과 전처리 연산자 들입니다.

 

#if ~ #elif ~ #else ~ #endif

#ifdef ~ #else ~ #endif

#ifndef ~ #else ~ #endif

이들은 if() ~ else if() ~ else ~ 문과 비슷합니다.
차이점이라면 if ~ else 는 컴파일이 끝나고 프로그램이 실행(runtime)시에 분기를 하는 용도지만 #if ~ #elif ~ #else ~ #endif 는 컴파일시에 어느 부분을 컴파일을 하게 할 지를 결정합니다.

 

예를들면 32 bit OS와 64bit OS간에 호환성을 유지하기 위해서

#ifdef _32BIT
    typedef unsigned int uint32; 
    typedef int int32;
    typedef unsigned long long uint64; 
    typedef long long int64;
#else
    typedef unsigned int uint32; 
    typedef int int32;
    typedef unsigned long uint64; 
    typedef long int64;
#endif

를 하여 type에 대한 호환성을 유지합니다. 그래서 32bit OS에서 컴파일할 때에는 예를들면 -D_32BIT option을 컴파일 옵션으로 추가합니다. 그러면 32 OS에서는 #ifdef 부분이 그렇지 않으면 #else 부분이 컴파일시에 사용됩니다.


그리고 변수를 선언할 때에는
int32 age;
이런식으로 사용하면 OS에 독립적으로 동작하게 됩니다.

 

#ifdef  #ifndef 는 반대의 의미입니다. 
#ifdef #define으로 매크로가 define되어 있으면의 의미이고 #ifndef 는 define되어 있지않으면 의미입니다.
#if는 defined 전처리 연산자와 논리 연산자 등과 함께 사용할 수 있습니다.

#if defined(_32BIT) && defined(_WINDOWS)
~
#endif

 

#if !define(_32BIT) 

#ifndef _32BIT
와 같습니다.

 

defined

defined는 #define이나 compile option으로 -D로 define한 매크로가 있는 지를 검사하는 C언어의 전처리 연산자입니다. defined 전처리기 연산자는 #if 절이나 #elif 절에서만 유효합니다.

각 컴파일러마다 나름대로의 매크로를 default로 define하여 시스템을 구분할 수 있도록 자동으로 설정됩니다.

#if는 모든 논리 연산자를 사용할 수 있습니다.
항상 로직을 수행하게 할려면
#if 1
//DEBUG로직.....
#endif

나중에 사용하지 않게 하려면 1을 0으로 바꾸면 전체가 컴파일 시에 누락됩니다.

위의 sample들은 각 OS가 제공해주는 컴파일의 header file 몇개만 열어보면 뭔 이야기인지 알 수 있을 것입니다.
vi /usr/include/unistd.h
해 보시고 뭔 말인지 한번 훑어보시면 합니다.

 

 

 

 

 

C Programming Language 문법

1. C 프로그래밍 언어는? 2. C언어 개발 환경 (실습 환경) 3. C언어의 컴파일 과정 4. C 소스 파일 구성 5. 주석문(Comment) 6. 식별자 명명 규칙 7. C 프로그래밍의 시작 - 함수 8. 변수와 상수 (정수형) 9. 변..

www.it-note.kr

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

Tag ,

댓글을 달아 주세요