2016-08-28 2 views
-1

텍스트 표현의 값과 16 진수 표현과 같은 값이 필요한 코드가 있습니다. 둘 다 필요하지만 잠재적 인 에러 소스를 없애기 위해 값을 한 번만 지정하고 전처리 기가 처리하도록합니다.전 처리기 스왑 인수

다음은 하나의 항목에 대한 예입니다.

int[] v = { 0x01, 0x02 }; 
LPCTSTR s = L"0102"; 

전 처리기 연결은이 점에서 강력한 도움이됩니다. 여기에 같은 코드가 있지만 전 처리기 명령을 사용합니다.

#define STRING2(x) #x 
#define STRING(x) STRING2(x) 

#define _S(t) _T(STRING2(t)) 
#define _H(t) 0x ## t 

#define _VS(a,b) _S(a) _S(b) 
#define _VH(a,b) _H(a),_H(b) 

LPCTSTR s = _VS(01, 02); 
int[] v = { _VH(01, 02) }; 

는 다음은 preprocesor에 의해 생성 된 코드는 다음과 같습니다

int[] v = { 0x01,0x02 }; 
LPCTSTR s = L"01" L"02"; 

하지만 난 여전히 내 데이터를 반복하고 있습니다. 그래서, 나는 이것을 시도한다.

#define ARGUMENTS 01, 02 

LPCTSTR s = _VS(ARGUMENTS); 
int[] v = { _VH(ARGUMENTS) }; 

이제 전 처리기 코드가 손상되었습니다!

int[] v = { 0x01, 02,0x }; 
LPCTSTR s = L"01" L; 

두 번째 인수와 concatinated되어야하는 토큰 파트가 스왑되거나 누락되었습니다. 하지만 왜?

VS2010 help page은별로 도움이되지 않습니다. 그것은 concatination 연산자가 매크로 expantion에 constrants를 퍼팅 내게 알려줍니다. 매크로 논증을 확장하는 것이 왜 힘들지는 것보다 가능성이 큽니다. 하지만 어떻게 작동합니까?

추가 테스트를 통해 매크로의 추가 확장이 중단되는 것은 분명하게 연결 연산자입니다. 따라서 먼저 인수를 확장 한 다음 연결 연산자를 사용하는 방법이 필요합니다. 좋은 생각? 이제 어떻게!

모든 의견을 환영합니다.

답변

1

ARGUMENTS 때문에 여전히 단일 값, 당신은 명확하게 두 출력에서 ​​볼 일입니다 - GCC 실제로 (두 번째 매개 변수의 처리하여 ARGUMENTS 단일 매개 변수로 취급, 더 많은 도움이되고 멀리 던졌습니다. error: macro "_VS" requires 2 arguments, but only 1 given으로 전처리).

당신이 원하는 것을 달성하기 위해,이 시도 :

#define MK_STRING_INT_PAIR(a,b,sname,vname) \ 
LPCTSTR sname=_VS(a,b); \ 
int[] vname={_VH(a,b)}; 

MK_STRING_INT_PAIR(01,02,s,v) 

[편집] 당신이 2 개 이상의 값이 필요한 경우를 생성하는 간단한 프로그램을 작성.의 라인에 매크로 H 파일 :

#define MK_PAIRS_2(sname,vname,v0,v1) ... 
#define MK_PAIRS_3(sname,vname,v0,v1,v3) ... 

#define MK_PAIRS_128(sname,vname,.... 

(나는 C++ 11이되어 내 뼈에서 느끼는 _VS, _VH 도우미 매크로에 의존 할 필요가 없습니다, 생성되는 variadic 템플릿과 char [] 타입의 constexpr-s를 사용하는 잠재력이 있지만, 지금은 그것을 탐색 할 시간이 없다).

+0

맞습니다. 선처리 프로세서가 바뀌지 않습니다. '첫 번째'논증은 논쟁의 전부입니다. 그것은 교환하고있는 것처럼 보인다. ARGUMENTS가 '01, 02,03 '까지 확장 된 간단한 테스트가 저에게 보여주었습니다. 따라서이 스레드의 올바른 제목은 'Preprocesor is parsing arguments'입니다. – PapaAtHome

+0

@PapaAtHome " ''프리 프로세서가 인수를 구문 분석하지 않습니다. ' 물론, 그것은 결코하지 않았다. –

+0

'당연히 아니야'는 나를위한 '이런 일들'입니다. 당신의 도움으로 뭔가를 배웠습니다. 감사. :-) – PapaAtHome

1

당신의 정의를 XMacros으로 다시 작성해야한다는 생각이 들었습니다. ,

VAL(01) 
VAL(02) 

당신은 단순히 적절한 매크로를 정의하고, 원하는 구조를 얻을 포함보다 : 그것은이 같은 데이터 정의를 포함합니다 (일반적으로 .def 확장자) 하나 개의 파일을 작성해야합니다 멋진 기술이다 그래서 같은 :

#define VAL(x) _H(x), 
    int[] v = { 
    #include "values.def" 
    }; 
#undef VAL 

#define VAL(x) _S(x) 
    LPCTSTR s = 
    #include "values.def" 
    ; 
#undef VAL 
+0

어떻게 작동하는지 볼 수 있습니다. 그리고 XMacros에 대한 매우 흥미로운 기사! 이 솔루션이 어느 정도 '깊이 우선'인 경우 Adrian Colomitchi가 suggetsted 한 솔루션은 다소 '호흡 우선'입니다. 두 기술 모두 작동 할 것이므로 이제는 내가 원하는 것을 선택할 수 있습니다. – PapaAtHome