드디어 새로운 챕터인 표준 라이브러리에 들어가게 되었다.
새로운 챕터이니 만큼 새로운 지식을 머리속에 집어넣어야 한다는 압박감을 잠시 느꼈지만 그 걱정이 무색하게 선행처리기의 내용은 정말 별것 아니었다.
처음 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의 자리에 #ifndef 을 넣으면 정의하지 않았을때 명령을 수행하는 조건문을 만들 수 있다.
#ifdef MAX //정의된 매크로가 없는 경우 참으로 판단
#define MAX 3 // 매크로 정의가 없으므로 매크로 정의
#endif
선행처리기에도 #if 와 #elif 와 같은 조건문이 있지만 파이썬에 사용된 조건문과 완벽히 같기에 이 조건문은 그냥 넘어가기로 했다
그저 주의해야 할점은 맨 마지막에 #endif 를 통해 조건문을 끝내줘야 한다
'프로그래밍 > c언어' 카테고리의 다른 글
퀵소트를 이용한 구조체 정렬(아직임) (2) | 2022.11.14 |
---|---|
응용 프로그램 작성 (배열 차순 정렬) -c언어 (0) | 2022.07.27 |
파일 입출력 라이브러리 (0) | 2022.07.26 |
표준 입출력 함수와 문자열 함수(엔터키 무시, 외울 함수 많음) -C언어 (0) | 2022.07.25 |
와! 구조체! 신세계! (짤막한 포인터) -C언어 (0) | 2022.07.13 |