프로그래밍/c언어

표준 라이브러리의 선행 처리기 -C언어

량아이 2022. 7. 13. 17:06

드디어 새로운 챕터인 표준 라이브러리에 들어가게 되었다.

새로운 챕터이니 만큼 새로운 지식을 머리속에 집어넣어야 한다는 압박감을 잠시 느꼈지만 그 걱정이 무색하게 선행처리기의 내용은 정말 별것 아니었다.

선행처리기 명령

 

처음 c언어를 쓰게되면 거의 무조건적으로 #include 와 <stdio.h>를 써야하는 데 이 챕터에서 왜 이 헤더파일을 사용해야 하는가에 대해 잠깐 짚고 넘어갔다.

그러면서 입력받은 알파벳가 대,소문자인지 가려내고 이를 대->소 , 소 -> 대 로 변환하는 프로그램을 잠깐 만들어 보았는데

별 내용은 아니었고 그냥 엑셀에서 함수를 사용해 대소문자를 변환하는 것과 비슷했다.

#include<ctype.h> //알파벳 변환 함수 헤더

int main(){
...
if(isupper(op)) //알파벳 대문자를 판단하는 함수
	op = tolower(op);  //알파벳 대문자 -> 소문자로 변환 함수
    
else if(inlower(op))  //알파벳 소문자를 판단하는 함수
	op = toupper(op);  //알파벳 소문자 -> 대문자로 변환 함수
...}

이런식의 매우 간단한 코드이다.

 

 

 

 

이후 #define을 사용하여 #define 특정이름 기호상수 이런 형태로 입력하게 되면 사용자 헤더 파일을 정의하게 되면 

예시) #define NAME "홍길동" 을 헤더파일 myst.h에 정의

        #include "myst.h" // <>가 아닌 쌍따옴표 "" 에 주의!

이렇게 헤더파일을 불러오게되면 다른 변수선언없이 메인 프로그램에서 사용할 수 있다!

 

 

이렇게 헤더파일을 직접 정의하여 사용하는 방법 말고도 #define을 통해 어디에든지 변수를 선언하고 사용할 수 있다.

이를 매크로(macro)라고 하는데 자주 사용되는 상수나 명령을 약어로 정리하여 필요할 때마다 간단하게 사용할 수 있다.

물론 여기에 사용된 변수는 따로 메인 프로그램에서 선언하지 않아도 사용할 수 있다.

#include <stdio.h>
#define S 1 //세미콜론은 사용하지 않음!

int main(){
    #define E 100 //메인 프로그램 안에 사용해도 됨
    printf("%d %d\n", S, E);
}

결과는 이렇게 나온다

매크로 사용 예시

매크로엔 수식을 넣어도 된다.

#include <stdio.h>
#define S 3 //세미콜론은 사용하지 않음!


int main(){
    #define E 100
    #define G S * E
    printf("%d\n", G);
}

결과에도 300이라고 이상없이 나온다

 

 

여기서 중요한 점은 매크로 함수를 상용할 때인데,

예를들어 a = 2+5 즉 gob(2+5) 이었을 때

#define gob(a) (a * a)

#define gob(a) ((a)* (a))  

의 결과는 전혀 다르게 나온다

 

그 이유는 #define gob(a)(a * a) 행에서는 수식이 (2 + 5 * 2 + 5)로 계산되기 때문에 곱셈이 먼저 계산되어 (2 + 10 + 5) = 17이 되고

#define gob(a) ((a)* (a))  에서는 ((2+5) * (2+5))인 (7 * 7)이 되여 결과값이 49가 되어버린다

이점에만 유의하면 그리 어려운 것은 없다.

 

 

선언한 매크로 취소 방법은 undef 를 통해 정의 취소를 할 수 있다.

#define E 100  //정의
#undef E  //정의 취소
#define E 50 // 다시 정의

 

매크로가 정의가 되었는지에 따라 #ifdef (정의함) 와 #ifndef(정의 안함) 을 사용해 조건문을 만들 수도 있다.

#include <stdio.h>
#define S 3 //세미콜론은 사용하지 않음!

int main(){
    
    #ifdef S
    printf("S 매크로를 정의 함\n"); //S를 3으로 정의했으므로 참이 됨
    #else
    printf("S 매크로를 정의 안함\n");
    #endif //이프문 끝내기 "반드시 사용"
}

#ifdef 사용

#ifdef의 자리에 #ifndef 을 넣으면 정의하지 않았을때 명령을 수행하는 조건문을 만들 수 있다.

 

#ifdef MAX //정의된 매크로가 없는 경우 참으로 판단
#define MAX 3 // 매크로 정의가 없으므로 매크로 정의
#endif

 

선행처리기에도 #if 와 #elif 와 같은 조건문이 있지만 파이썬에 사용된 조건문과 완벽히 같기에 이 조건문은 그냥 넘어가기로 했다

그저 주의해야 할점은 맨 마지막에 #endif 를 통해 조건문을 끝내줘야 한다