텍스트 표현의 값과 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를 퍼팅 내게 알려줍니다. 매크로 논증을 확장하는 것이 왜 힘들지는 것보다 가능성이 큽니다. 하지만 어떻게 작동합니까?
추가 테스트를 통해 매크로의 추가 확장이 중단되는 것은 분명하게 연결 연산자입니다. 따라서 먼저 인수를 확장 한 다음 연결 연산자를 사용하는 방법이 필요합니다. 좋은 생각? 이제 어떻게!
모든 의견을 환영합니다.
맞습니다. 선처리 프로세서가 바뀌지 않습니다. '첫 번째'논증은 논쟁의 전부입니다. 그것은 교환하고있는 것처럼 보인다. ARGUMENTS가 '01, 02,03 '까지 확장 된 간단한 테스트가 저에게 보여주었습니다. 따라서이 스레드의 올바른 제목은 'Preprocesor is parsing arguments'입니다. – PapaAtHome
@PapaAtHome " ''프리 프로세서가 인수를 구문 분석하지 않습니다. ' 물론, 그것은 결코하지 않았다. –
'당연히 아니야'는 나를위한 '이런 일들'입니다. 당신의 도움으로 뭔가를 배웠습니다. 감사. :-) – PapaAtHome