Language/C
[따배씨] 16.4 함수 같은 매크로
migrationArc
2021. 8. 12. 17:03
따배씨 - 따라하며 배우는 C언어
16강 전처리기와 라이브러리
16.4 함수 같은 메크로
#include <stdio.h>
/*
Function-like macros
#define ADD(X,Y) ((X) + (Y))
X and Y : macro arguments
*/
#define ADD1(X,Y) X+Y
#define ADD2(X,Y) ((X)+(Y))
#define SQUARE(X) X*X // ((X)*(X))
int main()
{
int sqr = SQUARE(3);
int a = 1;
printf("%d\n", 2 * ADD1(1, 3)); // 2 * X + Y = 2 * 1 + 3 = 5 //WRONG!!
printf("%d\n", 2 * ADD2(1, 3)); // 2 * (1 + 3) = 8
printf("%d\n", SQUARE(1 + 2)); // 1+2*1+2 = 1 + 2 + 2 = 5 //WRONG!!
printf("%d\n", 100 / SQUARE(3 + 1)); // 100 / 3 + 1 * 3 + 1 = 33 + 3 + 1 = 37 // WRONG!!
printf("%d\n", SQUARE(++a)); // ++a * ++a = 2 * 3 = 6 //DANGEROUS!
return 0;
}
- Function-like Macros 는 연산의 순서가 예상과 다를 경우가 발생할 수 있으므로 주의
#include <stdio.h>
/*
Stringizing operator #
- converts macro parameters to string literals
*/
#define SQUARE(X) (X)*(X)
#define PRINT_SQR1(x) printf("The square of %d is %d\n", x, SQUARE(x))
#define PRINT_SQR2(x) printf("The square of " #x " is %d\n", SQUARE(x))
/*
## operator combines two tokens into a single token
*/
#define XNAME(n) x ## n
#define PRT_XN(n) printf("x" #n " = %d\n", x ## n);
int main()
{
PRINT_SQR1(10);
// The square of 10 is 100
PRINT_SQR2(10);
// The square of 10 is 100
printf("\n");
int XNAME(1) = 1; // int x1 = 1;
int XNAME(2) = 2; // int x2 = 2;
PRT_XN(1); // printf("x1 " = %d\n", x1);
// x1 = 1
PRT_XN(2); // printf("x2 " = %d\n", x2);
// x2 = 2
return 0;
}
#define PRINT_SQR2(x) printf("The square of " #x " is %d\n", SQUARE(x))
PRINT_SQR2(10);
// The square of 10 is 100
- 입력받은 x 를 프로그래머가 타이핑 한 것처럼 문자열 처리
#define XNAME(n) x ## n
int XNAME(1) = 1;
// int x1 = 1
// XNAME(1) == x1
- x 는 유저가 타이핑 한 것, n 은 입력받은 것으로 처리
/*
Macro or Function ?
- no space in the macro name
- Use parentheses
- Use captital letters for macro function names
- Speed up?
*/
#define MAX(X, Y) ((X) > Y ? (X) : (Y))
#define MIN(X, Y) ((X) < Y ? (X) : (Y))
#define ABS(X) ((X) < 0 ? -(X) : (X))
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
http://blog.naver.com/atelierjpro
실리콘 밸리의 프로그래머 : 네이버 블로그
안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.
blog.naver.com
http://www.inflearn.com/course/following-c
홍정모의 따라하며 배우는 C언어 - 인프런 | 강의
'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원
www.inflearn.com