2013-05-13 6 views
-1
#define DECLARE_DELETE_PTR(type) \ 
void DeletePtr_##type(string &operand) \ 
{\ 
}\ 

C++의 매크로 정의에서 ##의 의미는 무엇입니까?C++의 정의 코드에서 ##의 의미는 무엇입니까?

다음 코드와의 차이점은 무엇입니까?

#define MAKE_STRINGS(VAR) #VAR 

그것은 단지 하나의 #이지만, 전자는 두 개의 #

+0

참조로 확장 할 [C 매크로 지침 (http://stackoverflow.com/questions/8685619/macro-directives (여러 가지 해답에 대한 주석에서 언급 한 바와 같이 단일 문자열로 된) #와 함께 [C 전 처리기와 연결] (http : // stackoverflow)에 대한 설명을 위해 -in-c-my-code-example-doesnt- .com/questions/1489932/c-preprocessor-and-concatenation /)를 사용하여이 질문에 대한 답을 얻을 수 있습니다. –

답변

2

그것은 당신이 매개 변수 type 통과 값을 연결 ...

DECLARE_DELETE_PTR(gremlin) 

확장겠습니까. 다음은 예입니다

DECLARE_DELETE_PTR(MyType) 

가 //이 (다른 사람의 사이에)

void DeletePtr_MyType(string &operand) 
{ 
} 
+0

다음 코드와의 차이점은 무엇입니까? #define MAKE_STRINGS (VAR) #VAR 하나만 #이지만 이전은 두 # – jiafu

+1

단일 해시는 * 문자열링 * (값을 소요하고 큰 따옴표로 묶습니다). 이중 해시는 * 대체 *를 수행합니다. 그래서,'MAKE_STRINGS (gremlin)'은''gremlin ''으로 확장 될 것입니다. – paddy

+0

@Paddy : 아니오 - 이중 해시는 토큰 연결을 수행하므로, 예를 들어'x ## y'를 붙이면 하나의 토큰 인'xy'가됩니다. –

2

그것은 두 개의 토큰을 연결하는 D 파일러를 요청합니다.

#define DECLARE_DELETE_PTR(type) \ 
void DeletePtr_##type(string &operand) \ 
{\ 
}\ 

DECLARE_DELETE_PTR(int)

는 줄 것이다 :

실제로
void DeletePtr_int(string &operand) 
      //^^^ the macro argument is int, so the precompiler replaces it here 
{ 
} 

는 매크로 코드에서 인수 type은 명령의 나머지 부분과 연결됩니다. 매크로 인수가 int 인 경우 위의 결과를 제공하는 단순한 결합입니다. 전 처리기 지시문이므로 컴파일 할 때 전적으로 발생합니다.

리눅스를 사용하는 경우 cpp 명령어를 사용하여 더 잘 이해하고 검토하는 것이 좋습니다.


두 번째 질문에서 두 가지 질문은 단순히 두 개의 다른 연산자입니다.

마찬가지로 이름에서 알 수 있듯이 -> 인수를 C 문자열로 바꿉니다 (방금 시도했습니다). 예를 들어 :

std::cout << "Hello World" << std::endl 

을 또는 더 흥미로운 :

std::cout << MAKE_STRINGS(Hello World) << std::endl; 

가로 변신 것

std::cout << MAKE_STRINGS("Hello" World) << std::endl; 

가된다 :

std::cout << "\"Hello\" World" << std::endl; 

를 그것은 또한 탈출을 담당 나타납니다 특수 문자들 나는 잘못 될 수 있습니다 - 그건 3 분 전에 실험에서 나온 것입니다. ## 연산자는 두 개의 토큰을 연결하는 데 사용됩니다

void DeletePtr_gremlin(string &operand) 
{ 
} 
+2

문자열이 아님 - 토큰. 규칙은 실제로 매우 엄격합니다. –

+0

참 - 혼란 스러울 수 있습니다. 고마워, 고마워. – Nbr44

+0

다음 코드와의 차이점은 무엇입니까? #DEFINE의 MAKE_STRINGS (VAR) #VAR 단지 하나 #이지만, 전자는 두 # – jiafu

2

:에

+0

다음 코드와의 차이점은 무엇입니까? #define MAKE_STRINGS (VAR) #VAR 하나만 #이지만 이전은 두 # # – jiafu

+0

단일 "#"을 사용하면 문자열이 생성됩니다. http://gcc.gnu.org/onlinedocs/cpp/Stringification.html을 확인하십시오. – Arun

관련 문제