2015-01-29 5 views
0

VS2010 C++의 전처리기를 사용하여 버전 문자열을 정의하고 있습니다.VS2010 C++ 전처리 기와 중첩 된 괄호

오류 C2143 : 구문 오류 : 나는 다음과 같은 오류를 얻을 수 sJunk 초기화 할 깨진 사용하는 경우

#define IMPORT_VERSION_1_1      L"IMPORT 1.0" 
#define EPAPI_VERSION_1_1      L"EPAPI 1.1" 
#define EPAPI_VERSION_1_2      L"EPAPI 1.2" 
#define EPAPI_VERSION_1_3      L"EPAPI 1.3" 
#define EPAPI_VERSION_ALL_1_2     (EPAPI_VERSION_1_2 L"," EPAPI_VERSION_1_3) 
#define EPAPI_VERSION_ALL_1_2_NoParens   EPAPI_VERSION_1_2 L"," EPAPI_VERSION_1_3 
#define EPAPI_VERSION_ALL_1_3     (EPAPI_VERSION_1_3) 

#define Broken         (EPAPI_VERSION_ALL_1_2   L"," IMPORT_VERSION_1_1) 
#define Works         (EPAPI_VERSION_ALL_1_2_NoParens L"," IMPORT_VERSION_1_1) 

const wchar_t* sJunk = Broken; 

: 나는 다음과 같은 # 정의가 문자열
'이전에 누락') ' 오류 C2059 : 구문 오류 : ')'

내가 작품, 아니 오류를 사용하고, 내가 바라고있어 문자열을 얻을 경우

: EPAPI 1.2,EPAPI 1.3,IMPORT 1.0합니다.

분명히 중첩 된 괄호는 EPAPI_VERSION_ALL_1_2입니다. 그러나 괄호 안의 매크로에 대한 부작용이 문서화되어 있기 때문에 나는 그것을 피할 수 있다면 제거하고 싶지 않습니다.

누구나 내가 원하는 매크로를 정의하고 괄호를 지키는 방법에 대한 제안을 할 수 있습니까?

THanks

답변

0

복잡한 결과가있는 간단한 이유.

Broken 
(EPAPI_VERSION_ALL_1_2 L"," IMPORT_VERSION_1_1) 
((EPAPI_VERSION_1_2 L"," EPAPI_VERSION_1_3) L"," L"EPAPI 1.1") 
((L"EPAPI 1.2" L"," L"EPAPI 1.3") L"," L"EPAPI 1.1") 

코드는 서로 이어지는 두 개의 문자열 리터럴이 연결된다는 사실에 달려 있습니다. 이것은 우리가 간단하게 할 수 의미

((L"EPAPI 1.2,EPAPI 1.3") L",EPAPI 1.1") 

지금, 두 개의 문자열 리터럴이 남아 있습니다 - 을하지만 그들은 바로 옆에 서로하지 않습니다!.

대신 낡은 표현식 (괄호로 묶은 것)이 있고 바로 뒤에 문자열이옵니다. 컴파일러는 연산자를 사용하거나 다른 괄호를 닫는 것이 좋습니다. 그리고 이것은 컴파일러 메시지가 어디서 오는가라는 것입니다. )이 필요합니다.

제안 된 해결 :)

문자 연결이 렉서에서 일어나는 문자열 이런 종류의 이후

#define EPAPI_VERSION_ALL_1_2 (EPAPI_VERSION_ALL_1_2_NoParens) 

P.S :이 컴파일러 빌더 해결하기 위해 실제로 매우 어렵다