programing

다중 라인 전처리기 매크로

prostudy 2022. 4. 24. 09:34
반응형

다중 라인 전처리기 매크로

멀티 라인 전처리기 매크로 만드는 방법?난 한 줄 만드는 법을 알아

#define sqr(X) (X*X)

하지만 난 이런게 필요해

#define someMacro(X)
    class X : public otherClass
    {
         int foo;
         void doFoo();
    };

어떻게 하면 이걸 작동시킬 수 있을까?

이것은 하나의 예일 뿐인데, 실제 매크로가 매우 길 수도 있다.

당신이 사용하는 것은\줄 연속 탈출 캐릭터로 말이야

#define swap(a, b) {               \
                       (a) ^= (b); \
                       (b) ^= (a); \
                       (a) ^= (b); \
                   }

EDIT: @abelenky가 논평에서 지적한 바와 같이.\문자는 줄의 마지막 문자여야 한다.그렇지 않으면(이후 공백이라고 해도) 그 뒤에 각 행에 혼란스러운 오류 메시지가 나타날 것이다.

백슬래시(백슬래시)를 넣어 매크로 스팬을 여러 줄로 만들 수 있다.\각 행의 끝에서 ):

#define F(x) (x)   \
              *    \
             (x)

Kerrek SB와 coaddict가 지적한 바와 같이, 수락된 답변에서 지적되었어야 하는 점은 항상 당신의 주장에 주의를 기울이십시오.sqr 예는 CompSci 과정에서의 간단한 예다.

문제는 다음과 같다."sqr(1+5)"라고 말할 때 일어나는 일을 그렇게 정의한다면"1+5*1+5" 또는 11이 표시됨
교정기를 제대로 끼우면#define sqr(x) ((x)*(x))
(1+5) * (1+5) 또는 우리가 원했던 36... 아름다워.

에드 S.도 '스왑'과 같은 문제를 겪게 될 것이다.

비록 이것이 원래 질문의 일부는 아니었지만, 다른 어떤 대답도 멀티라인 매크로에 포함된 코멘트가 세심한 주의를 필요로 한다는 것을 언급하지는 않는다.

  • C++ 스타일 코멘트는 줄 연속 이스케이프 문자가 있는 줄에는 표시할 수 없다.
  • C형 코멘트는 라인 연속 이스케이프 문자로 구분된 여러 줄에 걸쳐서는 안 된다.

예:

// WRONG:
#define someMacro(X)          \
// This comment is a problem. \
class X : public otherClass   \
{                             \
     int foo;                 \
     void doFoo();            \
};

// WRONG:
#define someMacro(X)        \
/* This comment is also     \
 * a problem. */            \
class X : public otherClass \
{                           \
     int foo;               \
     void doFoo();          \
};

// OK:
#define someMacro(X)                \
/* This comment is fine. */         \
class X : public otherClass         \
{                                   \
     int foo; /* This is OK too! */ \
     void doFoo();                  \
};

줄 끝에 있는 뉴라인에서 탈피하여 탈출할 필요가 있다.\:

#define sqr(X) \
        ((X)*(X))

지금은 2021년이고 우리는 정말로 앞으로 나아가야 한다.inline부정확하고, 불필요하며, 매크로를 과도하게 사용하면 코드가 부풀어 올라 디버깅하기 어렵다(정말 디버깅하기 어렵다)

inline void foo(x)
{
   // do whatever with x
}

만약, 그러나 매크로가 정말로 시간의 필요라면, 그들을 에워싸고do { } while(0);이 게시물에는 이유가 설명되어 있다. 매크로에서 왜 의미 없는 do와 if-else 문구를 사용하는가?

멀티라인 매크로도 같은 함수를 쓸 수 있지만, 각 문장은 다음과 같이 끝난다.“\”예를 들어 봅시다.아래는 간단한 매크로로, 사용자로부터 입력 번호를 받아 입력된 번호가 짝수인지 홀수인지 여부를 출력한다.

#include <stdio.h>
  
#define MACRO(num, str) ({\
            printf("%d", num);\
            printf(" is");\
            printf(" %s number", str);\
            printf("\n");\
           })
  
int main(void)
{
    int num;
  
    printf("Enter a number: ");
    scanf("%d", &num);
  
    if (num & 1)
        MACRO(num, "Odd");
    else
        MACRO(num, "Even");
  
    return 0;
}

참조URL: https://stackoverflow.com/questions/10419530/multi-line-preprocessor-macros

반응형