몽상실현개발주의

[따배씨] 16.4 함수 같은 매크로 본문

Language/C

[따배씨] 16.4 함수 같은 매크로

migrationArc 2021. 8. 12. 17:03

[따배씨] 16.4 함수 같은 매크로

따배씨 - 따라하며 배우는 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

 

Comments