전 처리기 지시문에서 ## (이중 해시)는 무엇을합니까?


91
#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;

위의 라인은 Unreal 4에서 가져온 것이며, 저는 Unreal 포럼에서 질문 할 수 있다는 것을 알고 있습니다.하지만 이것은 여기에서 질문해야하는 일반적인 C ++ 질문이라고 생각합니다.

첫 번째 줄이 매크로를 정의한다는 것을 이해하지만 C ++의 전 처리기 헛소리에 정통하지 않아서 거기에서 길을 잃었습니다. 논리는 백 슬래시가 선언이 다음 줄로 계속됨을 의미한다고 말합니다.

FThreadSafeStaticStat는 템플릿과 비슷해 보이지만 C ++에서 본 적이없는 구문과 #이 있습니다.

누군가 이것이 의미하는 바를 말해 줄 수 있습니까? 언리얼 4에 액세스 할 수 없을 수도 있다는 점을 이해합니다.하지만 제가 이해하지 못하는 구문 일뿐입니다.


6
cppreference 에서 ## 연산자 대해 읽을 수 있습니다
Cubbi

1
##연결 연산자라고 할 수 있습니다.
dyp

1
오, 정말 멋지네요! 상당히 많은 것을 설명합니다. 감사합니다. 하지만 왜 struct 키워드가 사용됩니까? 라인은 변수 정의처럼 보입니다
DavidColson 2014-04-09

1
struct소개 정교한 형식 지정자를 지금까지 내가 말할 수있는.
dyp

2
공식 명칭은 두 개의 전처리 토큰을 결합하여 다른 토큰을 생성하기 때문에 "토큰 붙여 넣기 연산자"입니다. 결과가 유효한 전처리 토큰 인 경우에만 유효합니다. 예를 들어 + ## 3를 만들 수 없습니다 +3. (하지만 + 3물론 운영자 없이도 가능합니다)
MM

답변:


175

## 연결을위한 전 처리기 연산자입니다.

그래서 당신이 사용한다면

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().


8
##의 동작을 배우기 위해 그렇게 많이 생각할 줄은 몰랐지만 이제는 절대 잊지 못할 것 같아요? 감사합니다.
NicoBerrogorry

2
따라 가는데 시간이 좀 걸렸지 만이 질문에 대한 환상적인 대답이었습니다. 감사.
n00dle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.