sourcecode

##(더블 해시)는 프리프로세서 디렉티브에서 무엇을 합니까?

copyscript 2022. 8. 30. 22:26
반응형

##(더블 해시)는 프리프로세서 디렉티브에서 무엇을 합니까?

#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에서).

##는 연속되는 식별자를 연결하여 함수를 매개 변수로 전달할 때 유용합니다.다음은 예를 제시하겠습니다.foofunction 인수를 첫 번째 인수로 받아들이고 연산자를 사용합니다.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

반응형