기본 콘텐츠로 건너뛰기

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

라즈베리파이 커널 컴파일

- 라즈베리파이의 부트절차 1. Power on 2. SoC Rom의 첫번째 부트로더(Firmware)을 읽음. 3. 첫번째 부트로더가 MicroSD의 두번째 부트로더( bootcode.bin )을 호출 4. 두번째 부트로더가 MicroSD의 config.txt 파일을 읽고 실행. 5. 두번째 부트로더가 세번째 부트로더 ( start.elf )을 호출 실행 ARM core 활성화 6. ARM core가 네번째 부트로더( kernel.img )을 호출 실행 7. module load 8. init 실행 (daemon 실행) 부팅에 필요한 최소한의 세가지 : bootcode.bin, start.elf(start_cd.elf / start_x.elf), kernel.img - 라즈베리파이 커널 크로스 컴파일 - 커널 소스 내려받기 : 커널 소스가 필요한 이유? 임베디드 환경에 맞게 커널을 축소하기 위해서. git : sw 버전관리& 페키지를 쉽게 다운받기 위해 사용. #atp-get install git -y #git init #mkdir /raspberrypi 필요한 커널 소스 다운 및 크로스컴파일러 다운. : www.kernel.org 에서도 다운 가능. #cd /raspberrypi #apt-get update #apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 libc6-dev-i386 lib32z1 #git clone --depth=1 https://github.com/raspberrypi/linux #export KERNEL=kernel7 make를 이용해 크로스 컴파일 시켜줌. #apt-get install gcc-arm-linux-gnueabi make #cd linux #make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_

모든 프로그래머가 알아야 할 것들 목록.

Every Programmer Should Know Algorithms Big O Cheatsheet 📖   Grokking Algorithms Sorting Algorithms Numbers 📄   Floating Point Guide 📄   Basic Number Theory Every Programmer Should Know... 📄   Falsehoods Programmers Believe About Phone Numbers Strings Big List of Naughty Strings 📄   Unicode and Character Sets Homoglyphs Unicode Common Locale Data Repository Falsehoods Programmers Believe About Names Latency Interactive Latency Infographics 📄   Latency Numbers Every Programmer Should Know Time 📄   Falsehoods programmers believe about time 📄   More falsehoods programmers believe about time; “wisdom of the crowd” edition 📄   Some notes about time 📄   Falsehoods programmers believe about time and time zones Memory 📄   What every Programmer should know about memory Distributed Systems 📖   Designing Data-Intensive Applications 📜   Designs, Lessons and Advice from Building Large Distributed Systems 📜   Time, Clocks and the Orderi