프로그래밍 언어/C

C언어 11강 선행처리기 명령어 #define 함수 (상수치환/매크로)

happy_life 2020. 10. 31. 22:18

 

선행처리기란? 

abcdefgh123123.tistory.com/99

 

C언어 참고내용- 선행처리기(preprocessor)란?

선행 처리기(preprocessor) ●정의 컴파일러가 소스 프로그램을 기계어 코드로 번역하기 전에 일련의 작업을 수행하는 것 ●장점 프로그램의 쉬운 이해 프로그램의 수정 용이 프로그램의 간편한 이

abcdefgh123123.tistory.com

#define 함수

 

#선행처리기 명령어 #define함수 용도: 1) 상수를 치환

                                                     2) 매크로 함수를 정의     

                     

Q)선행처리기(preprocessor)란?

   --코드를 생성하는 것이 아니라, 컴파일러가 컴파일하기 좋도록 소스를 재구성해 주는 역할을 하는 것.

 

 

Q) 매크로(macro)란?

  --프로그램 내에서 반복적으로 사용되는 단어 또는 수행할 문장을 특정한 심벌(symbol)을 사용해서 나타내는 것

 -유의사항-

구분 설명
매크로 이름 1.보통 대문자를 사용
2.공백 문자가 나오기 직전까지의 문자열
매크로의 정의 1.매크로의 정의문에는 세미콜론(;)이 붙지 않는다
2.줄이 바뀌면 원/역슬래쉬(\)로 이어짐 표시
연산기능 1.연산 수행 X
2.치환만 수행 O
제한 1.문자 상수 또는 문자열 상수 내에서의 매크로 전개 X

 

 

#define함수 사용법:

  •  단순 치환:  #define 매크로이름   치환리스트
  •  매크로 정의:  #define 매크로이름(매개변수)   매개변수포함문자열

#define함수 단순 치환 사용법

 

●단순 치환 코드예제

-FST_NUM부터 LST_NUM까지 홀수의 합 계산하기

#include <stdio.h>

#define FST_NUM 1
#define LST_NUM 100

int main() {
	
	int cnt, hap = 0;

	for (cnt = FST_NUM; cnt <= LST_NUM; cnt += 2) {

		hap += cnt; //1+3+5+7 이런식으로 hap에 더해진다
	}

	printf("매크로 상수변환을 이용하여 %d부터 %d까지 홀수의 합을 계산하기\n", FST_NUM, LST_NUM);
	printf("%d부터 %d까지 홀수의 합: %d", FST_NUM, LST_NUM, hap);
	
	return 0;
}

*참고: #define 단순치환하는것(정의한 단어를 다른 값으로 정의하는 것)을 매크로 확장 이라고한다.

 

#define함수 매크로 함수 사용법

 

●매크로 함수 코드예제

 -세제곱을 구하기

#include <stdio.h>

#define square(a) (a)*(a)*(a)

int main() {
	int num;

	printf("●매크로함수를 이용하여 세제곱을 구하는 프로그램\n");
	printf("정수를 입력하세요: ");
	scanf_s("%d", &num);
	
	printf("%d의 세제곱: %d", num, square(num));
	return 0;
}

매크로 함수는 단순 치환과 달리 "매개변수" 가 있다는 것이 중요하다.

 

#define함수 취소와 재정의 하는법:

  삭제방법: 코드 중간에 #undef  매크로이름

  재정의하는법:  코드 중간에 #define 매크로이름 바꿀내용

 

#define함수 취소 삭제/재정의 코드예제

#include <stdio.h>

#define square(a) (a)*(a)*(a)

int main() {
	int num;

	printf("●매크로함수를 이용하여 제곱을 구하는 프로그램\n");
	printf("정수를 입력하세요: ");
	scanf_s("%d", &num);
	
#undef square(a)  //매크로 취소
#define square(a) (a)*(a)  //매크로 재정의

	printf("%d의 제곱: %d", num, square(num));
	return 0;
}

위에 있는 코드와 비교해볼 것!!