전처리문
실질적인 컴파일 이전에 미리 처리되는 문장을 가리킨다. 선행처리기라고도 한다. 따라서 컴파일러는 사용자가 작성한 코드를 컴파일하기 전에 전처리문에서 정의해 놓은 작업들을 먼저 수행한다.
#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 파일의 내용이 소스에 삽입된다.
#if, #ifdef, #elif
#if가 …조건이 참이라면 인 반면 #ifdef는 ...가 정의되어 있다면 이다.
#if나 #ifdef에 대응하여 else와 같은 역할을 수행한다. 조건들이 성립하지 않는 경우 이 처리를 하겠다 는 의미가 된다.
#elif : #if에 대응하여, else if 의 역할을 수행한다.