2012-06-26 1 views
2

내가 //" 아래 등의 매크로 대체에 전달 될 수있는 방법을 알고려고 전달하는 방법 :. STR(hel"lo) 또는 STR(hel//lo)를 호출하는 동안// 또는 "매크로 대체에

#define STR(str) #str 

이 있습니다 오류가 발생했습니다. 이러한 매크로를 전달할 방법이 있습니까

답변

2

은 문자열 또는 문자 상수에 포함 된 경우를 제외하고 매크로 호출에 전달할 방법이 없습니다. //은 주석 - 주석 처리가 완료되었습니다. 매크로가 처리되기 전에.

마찬가지로 naked double quote를 매크로에 전달할 방법이 없습니다. 큰 따옴표는 문자 상수 안에 있거나 문자열의 시작을 표시합니다.

/*'에 대해서도 마찬가지로 추론을 적절하게 변경합니다.

+1

최소한 gcc를 사용하면'-std = c89'를 사용하여 컴파일 할 때 매크로 호출에'/'를 전달할 수 있습니다. 문자열 화 된 경우 유효한 토큰 (위의 "hel // lo"에서 결과 (STR (hel // lo))을 얻을 수도 있습니다. –

+0

표준의 현재 및 이전 버전에 대해 논의하고있었습니다. 표준의 23 세 버전이 아닙니다. 그러나 엄밀한 C-only C89 컴파일러는 논리적으로 공백으로 구분 된 두 개의 pp-tokens로 공식적으로 전 처리기에 전달할 수 있습니다 (왜냐하면'//'는에있는 기호가 아니기 때문입니다). C89). –

0

아니요, 작성한대로 전달할 방법이 없습니다. 번역 단계 3은 "소스 파일이 주석을 포함하여 사전 처리 토큰과 연속 된 공백으로 분해됩니다." 이 STR (HEL // LO)을 의미

대신 주석의 후단 공간)와 STR (HEL (설정되어 있습니다.

"전처리 토큰 카테고리 헤더되는 이름 식별자, PP-숫자 , 문자 상수, 문자열 리터럴, 문장 부호 및 다른 사전 처리 토큰 문자와 어휘 적으로 일치하지 않는 단일 공백이 아닌 문자 '또는'문자가 마지막 문자와 일치하는 경우 동작은 정의되지 않습니다 "... 이는 STR (hel "lo)도 허용되지 않습니다.

0

ID 매크로와 평가하는 문자열 매크로가있는 경우

#define ID(X) X 
#define STR_EVAL(X) STR(X) 

당신은 하나가 작은 따옴표에 관해서는

STR_EVAL(ID(hel)ID(/)/lo) 

슬래시 "탈출"수, 미안 해요, 당신은 운입니다. 매크로에 대한 인수는 토큰이어야하며 작은 따옴표는 특히 토큰이 될 수 없습니다.