다중 라인 전처리기 매크로
멀티 라인 전처리기 매크로 만드는 방법?난 한 줄 만드는 법을 알아
#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
'programing' 카테고리의 다른 글
Eclipse에서 SWT 라이브러리를 로드할 수 없음 (0) | 2022.04.24 |
---|---|
TypeORM 및 Vue 클래스 구성 요소 (0) | 2022.04.24 |
gdb 명령 화면이 얼마나 선명하십니까? (0) | 2022.04.24 |
실제로 스택 오버플로 오류를 일으키는 요소는? (0) | 2022.04.24 |
Excel 셀의 숫자 문자열을 숫자가 아닌 문자열로 읽으려면 어떻게 해야 하는가? (0) | 2022.04.24 |