2013-11-21 3 views
7

문자열 화 연산자 #을 사용하려고하는데 오류가 발생했습니다. stray ‘#’ in program. 여기 내가 어떻게 사용하고 있는지.C/C++의 문자열 화 연산자

#define STR "SOME_STRING" 
#define BM 8 
#define NUM_OF_THREADS 8 
#define VER_STR (STR #BM #NUM_THREADS) 

나는 VER_STR에 대한 SOME_STRING88을 얻을 대신 오류가 기대된다. 내가 실수 한거야?

답변

9

숫자 상수를 문자열로 변환해야합니다. 그러나 구문은 매크로 매개 변수에만 유효하기 때문에 #BM은 오류입니다. 그래서 중간 매크로를 통해 강제로 확장해야합니다. 그리고 당신은뿐만 아니라 그것을 할 수있는 캐릭터 라인 화 매크로있을 수 있습니다

#include <iostream> 

#define STRINGIFY_(x) #x 
#define STRINGIFY(x) STRINGIFY_(x) 

#define STR "SOME_STRING" 
#define BM 8 
#define S_BM STRINGIFY(BM) 
#define NUM_OF_THREADS 8 
#define S_NUM_OF_THREADS STRINGIFY(NUM_OF_THREADS) 
#define VER_STR STR S_BM S_NUM_OF_THREADS 

int main() { 
    // your code goes here 
    std::cout << VER_STR; 
    return 0; 
} 

당신은 http://ideone.com/cR1KZP

편집에서 행동 위를 볼 수 있습니다

매그너스 호프가 지적한 것처럼, 당신은 캐릭터 라인 화를 호출 할 수 있습니다

#define VER_STR STR STRINGIFY(BM) STRINGIFY(NUM_OF_THREADS) 
+0

'# BM'은''BM "'을 제공하지 않으므로 컴파일 오류가 발생합니다. '#'은 함수 스타일 매크로의 매개 변수에서만 사용할 수 있습니다. – Angew

+0

@Angew, fixed. 나는 그것을 쓰는 동안 마음에있는 불완전한 해결책이 있었다. – StoryTeller

+1

완전성을 위해 :'# _def VER_STR STR STRINGIFY (BM) STRINGIFY (NUM_OF_THREADS)'와 함께 중간'S _...'-macros 없이도 작동합니다 : http://ideone.com/hbBQIp –