기본 콘텐츠로 건너뛰기

C : 매크로와 선행처리기(Preprocessor)

매크로(macro)란?

 : 컴퓨터 과학 분야에서 정해진 순서에 따라 어떻게 특정한 입력 시퀀스가 출력 시퀀스로 매핑되어야 하는지를 정의하는 규칙

- 선행처리 

: 컴파일 이전의 처리를 의미. 삽입해 놓은 선행처리 명령문대로 소스코드의 일부를 수정(단순치환, substitution)할 뿐.


#include <stdio.h> // 선행처리 "stdio.h 파일의 내용을 이곳에 가져다 놓으세요."

#define PI 3.14 // 선행처리 ( 지시자, 매크로, 매크로 몸체) PI : 오브젝트 유사 매크로(object-like macro) or 매크로 상수
#define NAME "이영준"
#define AGE 27
#define PRINT_ADDR printf("주소 : 경기도 고양시 일산구\n");
#define SQUARE(X) X*X
#define PRODUCT(X, Y) ((X)*(Y))
#define CIRCLE_AREA(R) (PRODUCT((R),(R)) * PI)

int main() {
double num;
double rad = 2.1;
num = PI * 3.5;
printf("파이 : %lf \n", num);
printf("반지름 %g인 원의 넓이 : %g \n\n", rad, CIRCLE_AREA(rad));

printf("이름 : %s \n", NAME);
printf("나이 : %d \n\n", AGE);
PRINT_ADDR;

int num2 = 20;
printf("num2의 제곱 : %d \n", SQUARE(num2) );
printf("3의 제곱 + 2 : %d \n", SQUARE(3 + 2)); // 3*3+2
printf("3+2의 제곱 : %d \n", SQUARE((3 + 2))); //(3+2)*(3+2)
return 0;
}


  • 연산을 요하는 매크로를 만들경우 관호를 마구마구 칩시다!
  • C로 라즈베리파이를 사용할때 PIN_NUM을 define 한다.


- 조건부 컴파일(Conditional Compilation)

: 특정 조건에 따라 소스코드의 일부를 삽입하거나 삭제할 수 있도록 디자인된 지시자.
  • #if 조건매크로 ... #elif 조건매크로 ... #endif
  • #ifdef 매크로 ... #endif : 정의되어 있다면.
  • #ifndef 매크로 ... #endif : 정의되지 않았다면
  • 위의 세 부분 모두 #else 의 삽입 가능

- 매개변수의 결합과 문자열화

#define STRING_JOB(A, B) "A의 직업은 B입니다."

printf("%s", STRING_JOB(이영준, 개발자) );

출력 : A의 직업은 B입니다.


#define STRING_JOB(#A, #B) "A의 직업은 B입니다."
printf("%s", STRING_JOB(이영준, 개발자) );
출력 : 이영준의 직업은 개발자입니다.


- 매크로를 이용한 문자열 연결

#define STNUM(Y, S, P) Y##S##P
printf(학번 : %d \n", STNUM(10 11 187)); 


  • 숫자만 처리 가능하다.

- 결론 

: C언어 기초에 나오는 매크로 내용만 정리했습니다. 자세한 내용은 컴파일러 자료 관련 참고.

댓글

이 블로그의 인기 게시물

유닉스 & 리눅스 가계도. Unix&Linux Family

- Unix Family - Shell History

linux : /bin, /usr/bin 과 /sbin, /usr/sbin의 차이

/bin, /usr/bin 과 /sbin, /usr/sbin의 차이  : 모두 명령어가 저장되는 디렉토리 /bin       : 기본적인 명령어 , (권한 : 일반사용자) /sbin      : 시스템 관리를 위한 명령어, (권한 : root) /usr/bin  : /bin에 있는 명령을 제외한 기본적인 명령어, (권한 : 일반 사용자) /usr/sbin : /sbin에 있는 명령을 제외한 시스템 관리를 위한 명령어, (권한 : root)