C언어는 일반적으로 기게어로 바뀔때 5가지 과정을 통해서 변환된다.
우리는 그중 컴파일(어셈블러로 변환) 보다 전에있는 전처리 과정에 처리되는 전처리기에 대해서 알아보고자 한다.
전처리기는 전처리 과정에서 코드에서 삭제되고, 대신 그 기능을 실행한다.
모든 전처리기는 #으로 시작한다.
전처리기를 잘 사용하면 시간을 줄이거나, 코드를 깔끔하게 만드는등 장점이 많다.
1. #include
일반적으로 #include<stdio.h>로 프로그램 처음 배웠을때 부터 보았을 친구이다.
#include <stdio.h>
//C언어 표준헤더일때 주로 사용하는 방식
#include "abc.h"
//c언어 표준헤더가 아니고, 사용자가 추가한 파일을 헤더로 하는 방식
크게 두가지 방식으로, <>은 표준헤더일때, ""는 사용자 파일 헤더일때 사용한다고 생각하면 된다.
이 # include의 의미는, 그 소스코드 전체를 저기다 갔다 넣는 것을 의미한다. (위 코드는 stdio.h file 코드 전체, abc.h file 코드 전체가 올라간다고 생각하면 된다.)
이때 헤더파일에는 특정 함수의 선언만 되어있고, 그 정의는 이름이 같은 C file에 구현되어있다. (이 두개를 연결시키는 것은 빌드작업을 통해 IDE가 알아서 잘 해주니 신경쓰지 말것)
같은 헤더파일이 두개가 들어갈경우, 문제가 생겨야 하지만, .h 파일에 #ifdef를 이용한 중복방지를 해놓았으므로 중복을 피할 수 있다.
2. #define
#define ABC //매크로 정의
#define ABC 1 //매크로 상수 정의
#define MAX(a, b) ((a) > (b) ? (a) : (b)) //매크로 함수 정의
3가지가 조금씩 다른데
a. 매크로 정의는 그냥 이 값이 정의되었다만 알리고 싶을때 사용한다. 나중에 #if 등에 유용하게 쓰인다.
b. 매크로 상수 정의 이 ABC는 1이다 라고 알려주는 용도이다. 모든 ABC를 1로 바꾼다.
c. 매크로 함수 정의 이 함수를 이렇게 정의한다고 말하는 것이다. 모든 MAX(a,b)를 삼항연산자 꼴로 바꾼다.
이 define 된것을 지우고 싶을때는 #undef를 사용한다.
#def ABC
#undef ABC
a. undef를 사용할때는 ABC가 있어야하므로, ifdef와 웬만해선 같이쓴다.
b. def와 undef사이에는 def가 존재하는 개념이다.
3. #if, #ifdef, #ifndef
a. #if~#elif~#else~#endif
다들 생각하는 그 방법이다. 단, 일반적인 C언어와 약간 문법적으로 다르다.
#if _STR_
//사이내용은 자유롭게 들어감
#elif _ABC_
//마찬가지
#else
//마찬가지
#endif
//이 뒤로는 저 if문의 범위가 아님
이런식으로 구현된다.
b. #ifdef~#else~#endif #ifdef는 그것이 선언되어있는가에 대한 내용으로, .h 파일의 중복방지가 대표적이다.
c. #ifndef~#else~#endif b와 정반대를 의미한다.
'프로그래밍 구조' 카테고리의 다른 글
메모리 영역 (Rodata, bss등) (0) | 2021.11.28 |
---|---|
2차원 배열과 pointer (0) | 2021.11.05 |
fgets 사용법, 주의점 (0) | 2021.10.06 |
리눅스 명령어 정리(주요) (0) | 2021.09.22 |
C언어 전역,지역변수 static, extern, auto 정리 (0) | 2021.09.12 |