본문 바로가기

C Programming

전처리문

전처리문


실질적인 컴파일 이전에 미리 처리되는 문장을 가리킨다. 선행처리기라고도 한다. 따라서 컴파일러는 사용자가 작성한 코드를 컴파일하기 전에 전처리문에서 정의해 놓은 작업들을 먼저 수행한다.

  • #define

#define은 식별자 또는 매개 변수화된 식별자와 토큰 문자열을 연계한 매크로를 생성합니다매크로가 정의된 후 컴파일러는 소스 파일에서 발생하는 각 식별자를 토큰 문자열로 대체할 수 있습니다매크로를 사용하므로써 프로그램 내에서 자주 쓰이는 긴 수식이나 문장을 간략하게 정의하여 편리하게 사용할 수 있다.

#define 주의사항 특징

① #define문은 전처리문 이지 코드를 생성하는 명령이 아니다.

② 매크로의 이름도 일종의 명칭이기 때문에 명칭 규칙에 맞게 작성해야 한다.

③ 매크로 이름에는 공백이 들어갈 수 없지만 매크로의 실제 값은 공백을 가질 수 있다.

④ 문자열 상수 내에 있는 매크로나 다른 명칭의 일부로 포함된 경우는 치환되지 않는다.

#define문의 치환 리스트가 수식일 때에는 되도록 수식 전체를 괄호로 묶어주는 것이 좋다.


  • #, ## 연산자

#과 ##은 전처리기의 연산자로서 컴파일러가 #define 전처리 과정에서만 사용하는 특수한 연산자이다


  • #undef

#undef 지시문은 식별자의 현재 정의를 제거하여 이후로 나타나는 식별자 전처리기에서 무시된다#undef 를 사용하여 매크로 정의를 제거하려면매크로의 식별자만 기입하면 된다.


  • #pragma

C언어의 장점은 소스코드의 이식성에 있다. C언어의 문법을 지원하는 컴파일러만 있다면 C언어로 작성된 소스코드를 어느플랫폼 에서든 컴파일 할수 있다그러나 이러한 이식성은 소스코드에 국한된것이지 실제로 컴파일된 실행파일이 그런것은 아니다그래서 각 플랫폼에는 플랫폼에서 고유한 기능을 수행할수있는 자원이 필요하다플랫폼별로 기능이나 구조는 판이하기 떄문에 같은 기능이라도 내부적인 구현은 플랫폼마다 다를수밖에 없다. #pragma 지시자는 전처리기로서 플랫폼별로 다른 기능에대한 지시 사항을 컴파일러에게 전달하는 전처리기 이다.

  • #pragma once

 여러개의 c파일이 있을때하나의 파일이 수정되면그 파일만 컴파일하고 나머지는 하지 않는다.   ( 여러 번 인클루드 되는 것을 컴파일러 차원에서 막아줌 )


  • #pragma pack

서버통신시 패킷을 주고받을 때 1byte씩 주고 받는데 pragma pack(push, 1)을 통해 바이트를 나눠 통신함. 구조체에서는 패딩비트를 없애주는 역할을 함.


  • #error

#error 전처리문은 지정한 에러 메시지를 출력하고 전처리 과정에서 컴파일을 중지하도록 한다단독으로 사용되는 경우는 없으며 주로 조건부 컴파일 지시자와 함께 사용되어 컴파일 불가능한 상황임을 개발자에게 알려 주는 역할을 한다.


  • #include

이 명령은 괄호안의 파일을 읽어와 현재 위치에 삽입하는 역할을 한다. #include <stdio.h명령에 의해 이 자리에 stdio.h 파일의 내용이 소스에 삽입된다.

      #include <file.h> : C에서 제공하는 표준 헤더파일을 포함시키고자 할 때 < > 괄호를 사용한다 >괄호를 사용하면 표준 헤더 파일 디렉토리에서 지정한 파일을 찾는다.

      #include "file.h" : 사용자가 직접 작성한 헤더 파일을 포함시키고자 할 때 " "괄호를 사용한다이 괄호를 사용하면 소스 파일과 같은 디렉토리에서 헤더 파일을 먼저 찾아 본다직접 만든 헤더 파일은 보통 소스와 같은 디렉토리에 두므로 이 괄호를 사용하면 된다.

  • #if, #ifdef, #elif

      #if는 매크로의 값을 평가하거나 여러 가지 조건을 결합하여 컴파일 여부를 결정하는 좀 더 복잡한 전처리 문이다.  #if 구문은 if랑 아주 비슷하다. 이것은 어떠한 구문을 컴파일 할지 안 할지를 지정할 수 있다.

#if 조건이 참이라면 인 반면 #ifdef ... 정의되어 있다면 이다.

#if #ifdef에 대응하여 else와 같은 역할을 수행한다. 조건들이 성립하지 않는 경우 이 처리를 하겠다 는 의미가 된다.

#elif : #if에 대응하여, else if 의 역할을 수행한다.

      #ifndef 지시문은 #ifdef에서 확인하는 조건의 반대 조건을 확인합니다. 식별자가 정의되지 않았거나 해당 정의가 #undef를 통해 제거된 경우 조건은 true(0이 아닌 값)입니다. 그렇지 않으면 조건은 false(0)입니다.