본문 바로가기

컴퓨터/언어,프로그래밍

[C언어] C언어 선행처리기


C 프로그래밍

                          < 선행처리기>  

  C 프로그램에서 사용되는 선행처리기(preprocessor)로는 #define와 #include 그리고 #if - #endif가 있으나  여기서는 주로 사용되는 #define와 #include만을 설명하기로 한다.

이러한 선행처리기는 컴파일에 앞서 미리 처리된 후 컴파일되는 것을 말한다.

1.  #define선행처리기

    #define    LIMIT    100

    #define    PI        3.14159

이 있다면 선행처리기는 먼저 인용된 문자열을 제외하고 발생하는 모든 식별자 LIMIT를 100으로 식별자 PI를 3.14159로 변경시킨다.

  #define문장은 프로그램의 어느 라인에도 있을 수 있다. 단, 1컬럼부터 시작되어야 한다. 이것은 파일 내에서 그 문장 다음에 나타나는 문장들에 대해서만 작용을 한다. 일반적으로 모든 #define 문장은 파일의 처음 부분에 위치한다. 관례에 따라 선행처리에 의해 변경될 수 있는 모든 식별자는 대문자로 작성된다. 인용된 문자열에 나타난 내용은 선행처리기에 의해 절대로 변경되지 않는다. 예를 들면, 문장

    printf("\nPI = %f", PI);

에서 두 번째 PI만이 선행처리기에 전달되는 #define 명령에 의해 변경된다. 이렇게 기호상수를 이용하면 프로그램을 읽기 쉽게 해준다. 더 중요한 것은 만일 상수가 #define기능에 의해 기호로 정의되고 프로그램 전체에서 사용된다면 후에 변경할 필요가 있을 때 상수를 변경하기 쉽게 해준다는 점이다. 예를 들어 물리학에서 상수 c는 빛의 속도를 나타내는 데 이용되는데, 그 값을 299792.4562 km/sec이다. 만일

    #define C 299792.4562

라 작성하고 상수 299792.4562를 기호로 나타낸 C를 라인의 코드에서 이용한다면 새로운 물리학적 실험으로 보다 나은 빛의 속도의 값을 구했을 때 코드를 변경하기가 용이할 것이다. 모든 코드는 단지 #define 문장에서 상수값을 변경함으로써 변경된다.

  아래의 프로그램은 #define 기능의 이용법을 자세히 보여준다.

    /*** 태평양속의 바다 측정 ***/

    #define    AREA                           179680425

    #define    SQ_MILES_PER_SQ_KILOMETER   0.3861021585424458

    #define    SQ_FEET_PER_SQ_MILE           (5280 * 5280)

    #define    SQ_INCHES_PER_SQ_FOOT        144

    #define    ACRES_PER_SQ_MILE              640

    main()

    {

        int  pacific_sea = AREA;          /* in sq kilometers */

        double  acres, sq_miles, sq_feet, sq_inches;


        printf("\nthe pacific sea covers an area");

        printf("of %d square kilometers", pacific_sea);

        sq_miles = SQ_MILES_PER_SQ_KILOMETER * pacific_sea;

        sq_feet = SQ_FEET_PER_SQ_MILE * sq_miles;

        sq_inches = SQ_INCHES_PER_SQ_FOOT * sq_feet;

        acres = ACRES_PERS_SQ_MILE * sq_miles;

        printf("\n\nin other units of measure this is:\n");

        printf("\n%22.7e acres", acres);

        printf("\n%22.7e square miles", sq_miles);

        printf("\n%22.7e square feet", sq_feet);

        printf("\n%22.7e square inches\n\n", sq_inches);

  이 프로그램은 다양한 측정단위를 변환시키고, 그 결과를 프린트하는 것이다. 이 프로그램의 출력은 다음과 같다.

  the pacific sea covers an area of 179680425 squre kilometers in other    units of measure this is:

    4.4400000e+10 acres

        6.9375000e+07 square miles

        1.9340640e+15 square feet

        2.7850522e+17 square inches

이 새로운 프로그램 작성개념은 아래의 분석에서 설명한다.

프로그램 pacific_sea의 분석

    #define  AREA                               179680425


  1칼럼에서 시작되는 #define문장은 선행처리기의 명령어이다. 선행처리기는 이 파일의 나머지 부분에서 식별자 AREA가 발생할 때마다 이것을 179680425로 변경할 것이다. 선행처리기에 의해 변경되는 식별자는 관례적으로 대문자를 이용한다. 가까운 미래에 새로운 지도가 만들어지고 태평양지역에 대한 새로운 면적이 계산된다면 프로그램을 갱신하기 위해 이 라인만 변경하면 된다.

    #define  SQ_MILES_PER_SQ_KILOMETER    0.3861021585424458

  부동형 상수 0.3861021585424458은 변화계수이다. 이 상수에 대한 기호명을 쓰면 프로그램을 보다 쉽게 해준다.

    #define  SQ_FEET_PER_SQ_MILE             (5280 * 5280)

선행처리기는 첫 번째 문자의 열이 나타날 때마다 두 번째 문자의 열로 변경시킨다. 만일 1마일이 5,280피트라는 사실을 알고 있다면 코드의 이 라인이 옳다는 것을 쉽게 알 수 있다. (5280 * 5280) 대신에 27878400으로도 쓸 수 있다.

  괄호는 꼭 필요하지는 않지만 해가 있는 것은 아니다. 기호식에서는 기술적인 이유로 종종 괄호가 필요하다.

    int       pacific_sea = AREA;          /* in sq kilometers */

  코드가 컴파일될 때 선행처리기는  먼저 AREA를 179680425로 변경시킨다.

그런 다음 컴파일러는 이 라인을 int형의 변수인 식별자 pacific_sea에 대한 선언으로 번역하고, 이 식별자가 179680425의 값을 갖도록 초기화시킨다. 종종 변수를 초기화하면 이점이 있다. 그러나 여기에서는 다음과 같이 작성하는 것이 좋다.

    int       pacific_sea;

    double    acres, sq_miles, sq_feet, sq_inches;

    pacific_sea = AREA;

      초기화가  치환문으로 대체되었다.

    double   acres, sq_miles, sq_feet, sq_inches;

  변수 acres 등은 double형으로 정의되었다. float, 그리고 double은 두 개의 부동형이다. 그것들은 둘 다 실수값을 저장하는 데 사용된다. 전형적으로 float에는 유효숫자 6자리를 저장할 것이고, double에는 유효숫자 16자리를 저장할 것이다. 이 프로그램은 8자리 수를 프린트하기 때문에 변수들은 float보다 double형으로 선언한다.

    printf("\n%22.7e    acres", acres);

  이 문장은 아래의 결과를 프린트하도록 한다.

    4.4400000e+10    acres

  이 수는 과학적으로 표기로 쓴 것이고, 4.44×1010과 같은 의미로 해석된다. 이 방법으로 쓰여진 수는 또한 e_형식(e_format)으로 쓰였다고 말한다. 변환명세 %e는 부동형 식을 디폴트 공백선정으로 프린트한다. M과 N이 정수일 때 %M.Ne 형태의 형식은 부동형 식을 M자리 중 N자리를 소수점의 오른쪽에 e_형식을 프린트한다.

2. #include 선행처리기

  #include는 파일을 프로그램에 삽입시키는 선행처리기로서 크게 두 종류로 구분된다.

하나는 표준디렉토리에서 규정된 파일을 찾는 경우고 다른 하나는 현재 작업 디렉토리에서 규정된 파일을 찾는 경우로 각각의 규정은 아래와 같다.

     #include <stdio.h> : 표준 디렉토리에서 stdio.h라는 파일을 찾아 삽입

     #include "stdio.h"  : 현재의 작업 디렉토리에서 stdio.h라는 파일을 찾아 삽입

  이러한 #include도 #define와 마찬가지로 선행처리기도  1컬럼부터 시작해야만 한다. 전형적으로 #include는 프로그램의 서두에 쓴다. 포함된 파일은 #define 라인과 또 다른 #include 라인을 가질 수 있다. 그러한 파일은 종종 ‘헤더’파일로 간주된다. 그리고 관례에 의해 그러한 파일은 .h로 끝난다. #include의 기능을 자세히 설명하기 위해 pacific.h라는 파일은 생성했다고 가정하고, 그 파일에 아래의 라인을 삽입시켜 보자.

    #define    AREA                             179680425          

    #define    SQ_MILES_PER_SQ_KILOMETER  0.3861021585424458

    #define    SQ_FEET_PER_SQ_MILE          (5280 * 5280)

    #define    SQ_INCHES_PER_SQ_FOOT       144

    #define    ACRES_PER_SQ_MILE             640

그러면 프로그램 pacific_sea를 다음과 같이 다시 작성할 수 있다.

    #include    "pacific.h"

    main()

    {

      . . . . . . . .

'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글

[C언어] C언어란?  (0) 2009.03.17
[C언어] C언어 변수  (0) 2009.03.17
[C언어] C언어 자료의 입/출력  (0) 2009.03.17
[C언어] C언어 조건문  (0) 2009.03.17
[C언어] C언어 반복문'  (0) 2009.03.17
제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...