##(더블 해시)는 프리프로세서 디렉티브에서 무엇을 합니까?
#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;
위의 행은 Unreal 4에서 따온 것으로, 비현실적인 포럼에서 다시 질문할 수 있다는 것을 알고 있습니다만, 여기서 질문할 필요가 있는 일반적인 C++ 질문이라고 생각합니다.
첫 번째 줄에 매크로가 정의되어 있는 것은 알고 있습니다만, 저는 C++의 프리프로세서 셰나니건에 익숙하지 않기 때문에, 그 점에 대해서는 잘 모르겠습니다.논리적으로 백슬래시는 선언이 다음 행으로 계속된다는 것을 의미합니다.
FThread Safe Stat Stat은 템플릿과 비슷하지만 #가 사용되고 있으며 C++에서는 지금까지 본 적이 없는 구문입니다.
이게 무슨 뜻인지 누가 좀 말해줄래?Unreal 4에 액세스 할 수 없는 것은 알고 있습니다만, 저는 단지 구문을 이해할 수 없습니다.
##
는 연결용 프리프로세서 연산자입니다.
그래서 만약에
DEFINE_STAT(foo)
코드의 어디에 있든 간에
struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;
코드를 컴파일하기 전에.
여기 이것을 더 설명하기 위해 블로그 투고에서 나온 또 다른 예가 있다.
#include <stdio.h>
#define decode(s,t,u,m,p,e,d) m ## s ## u ## t
#define begin decode(a,n,i,m,a,t,e)
int begin()
{
printf("Stumped?\n");
}
이 프로그램은 컴파일 및 실행에 성공하여 다음 출력을 생성합니다.
Stumped?
이 코드로 프리프로세서가 호출되면
begin
로 대체되었습니다.decode(a,n,i,m,a,t,e)
decode(a,n,i,m,a,t,e)
로 대체되었습니다.m ## a ## i ## n
m ## a ## i ## n
로 대체되었습니다.main
따라서 효과적으로,begin()
로 대체되었습니다.main()
.
TLDR;##
연결용입니다.#
stringization용입니다(cppreference에서).
그##
는 연속되는 식별자를 연결하여 함수를 매개 변수로 전달할 때 유용합니다.다음은 예를 제시하겠습니다.foo
function 인수를 첫 번째 인수로 받아들이고 연산자를 사용합니다.a
그리고.b
두 번째 및 세 번째 인수:
#include <stdio.h>
enum {my_sum=1, my_minus=2};
#define foo(which, a, b) which##x(a, b)
#define my_sumx(a, b) (a+b)
#define my_minusx(a, b) (a-b)
int main(int argc, char **argv) {
int a = 2;
int b = 3;
printf("%d+%d=%d\n", a, b, foo(my_sum, a, b)); // 2+3=5
printf("%d-%d=%d\n", a, b, foo(my_minus, a, b)); // 2-3=-1
return 0;
}
그#
는 파라미터를 연결하고 출력을 따옴표로 묶습니다.예를 들어 다음과 같습니다.
#include <stdio.h>
#define bar(...) puts(#__VA_ARGS__)
int main(int argc, char **argv) {
bar(1, "x", int); // 1, "x", int
return 0;
}
언급URL : https://stackoverflow.com/questions/22975073/what-does-double-hash-do-in-a-preprocessor-directive
'sourcecode' 카테고리의 다른 글
"thread"가 없는 "while(true)"가 되는 이유는 무엇입니까?sleep'이 원인이 되어 Linux에서는 CPU 사용률이 100%이지만 Windows에서는 그렇지 않으면 Windows에서는 CPU 사용률이 100%가 되지 않습니다. (0) | 2022.08.30 |
---|---|
VUE2js: 소품 변경 후 컴포넌트를 재렌더하는 방법 (0) | 2022.08.30 |
PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init (&mutex, param) (0) | 2022.08.30 |
실행 중인 프로세스를 나열하는 Linux API? (0) | 2022.08.30 |
Vue.js를 사용하여 클릭 시 특정 하위 요소를 업데이트하려면 어떻게 해야 합니까? (0) | 2022.08.30 |