2017-02-04 4 views
2
이 광고

:병합 전처리 :

#define hash_hash # ## # 

##를 생성 할 수 있지만 그 정의되지 않은 동작에 기초한다 : 행동이 정의 결과가 유효한 전처리 토큰 없으면

인 .

EDIT : 환언

는 확장 hash_hash 두 인접한 예리한 표지판 의 이루어진하는 새로운 토큰 생산하지만 새로운 토큰 ## 연산자 아니다 . 전처리 토큰의

범주는 다음과 같습니다

전처리 토큰 다섯 개 광범위한 클래스로 분류 식별자, 전처리 번호, 문자열 리터럴의 부호 및 기타

것은 ## 새로운 토큰 기타 카테고리 UB이없는 경우에 해당합니다.

참고 : 시간을내어 질문에 대한 답변을 읽고 그에 따라 또는 downvoting하기 전에하십시오.

+4

정의되지 않은 동작의 의미는 무엇이라고 생각하십니까? 그것은 무엇이든 할 수 있다는 것을 의미합니다. –

답변

7

이것은 표준의 예입니다. ##은 유효한 전처리 토큰 인입니다. 거기에 사용 된 바와 같이 연결 연산자를 형성하는 토큰입니다. C 문법에는 의미가 없습니다 (사전 처리 후). 그러나 구두점 토큰 목록에 나타나는 것은 * 또는 ++입니다.

문법 규칙이 일치하지 않으므로 필연적으로 진단 할 구문 오류가 발생합니다. 을 제외하고는 문자열을 문자열 화하거나 무시하는 다른 매크로로 전달됩니다.

#define IGNORE(X) 
#define STRINGIZE_LIT(X) #X 
#define STRINGIZE(X) STRINGIZE_LIT(X) 

IGNORE(hash_hash) // OK, token is not passed to semantic analysis. 
printf(STRINGIZE(hash_hash)); // OK, same as printf("##"); 
+2

당신은 내 질문에 대답하지 않았다. 거기에 연결된 연결이라는 것을 나는 안다. – Sabrina

+1

@Sabrina 지금 질문을 편집했지만 대답은 같습니다. 예, 토큰이 "기타"범주에 있습니다. – Potatoswatter