2016-10-19 2 views
3

저는 광산 프로젝트를위한 x- 매크로 기반 레지스터 파일 레이아웃 설명 시스템을 작성하고 있습니다. 대부분의 경우 매크로는 템플릿 클래스의 계층 구조로 확장됩니다. 그러나 다음과 같이 모든 레지스터의 열거 형을 원합니다.가변 매크로 확장에서 쉼표는 어디에서 사라지나요?

#define RINT(num,name,flags,width) name, 
... 

enum Regs 
{ 
#include REGDEF 
}; 

잘 작동합니다. 그러나 가변 매크로를 사용하여 앨리어싱 레지스터를 지정합니다. __VA_ARGS__ (내가 틀렸다면 내가 알고있는 것을, 저를 수정하시기 바랍니다하지 않음)의 요소 사이에 쉼표를 제거 할 사소한 방법이 없기 때문에, 나는 쓰기 :

#define RALIAS_10(r0,r1,r2,r3,r4,r5,r6,r7,r8,r9) r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 
#define RALIAS_9(r0,r1,r2,r3,r4,r5,r6,r7,r8) r0 r1 r2 r3 r4 r5 r6 r7 r8 
... 
#define RALIAS_1(r0) r0 
#define RALIAS_N(d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,aliasn,...) aliasn 
#define RALIAS(...) RALIAS_N(__VA_ARGS__, RALIAS_10(__VA_ARGS__), RALIAS_9(__VA_ARGS__), ..., RALIAS_1(__VA_ARGS__)) 

을 지금, 나는이

RALIAS(RINT(4, RSP, 0, 64), RINT(4, ESP, 0, 32), RINT(4, SP, 0, 16), RINT(4, SPL, 0, 8)) 
를 작성하는 경우 RINT 매크로

쉼표가 사라 : 경우

enum Reg 
{ 
... 
RSP ESP SP SPL 
... 
}; 

, 차례로, 나는 RALIAS_4 매크로를 사용하여 직접

enum Reg 
{ 
... 
RSP, ESP, SP, SPL, 
... 
}; 

내가 GCC는 가변 인자 매크로에 로직을 제거 몇 가지 표준이 아닌 쉼표를 적용 알지만, 명시 적으로 -std = C++ (11)를 지정할 때 그런 일이 안 : 332,345,553,210

는 내가 기대하는 것을 얻을. 게다가 Clang은 나에게 똑같은 결과를 주었다. 그러나 표준 (초안)이나 GCC 문서에서이 동작을 설명 할 수있는 것을 찾을 수 없었습니다.

무엇이 누락 되었습니까?

나는 Arch Linux (x86-64)에서 GCC 6.1.1과 Clang 3.8.1을 시도했다. 두 컴파일러는 저장소에서 설치되었습니다.

답변

2

이 : 4가 비어있는 8 개 인수를 취 매크로 인

RALIAS(RSP,,ESP,,SP,,SPL,) 

:

RALIAS(RINT(4, RSP, 0, 64), RINT(4, ESP, 0, 32), RINT(4, SP, 0, 16), RINT(4, SPL, 0, 8)) 

가로 확장하는 것입니다. 인수 "RSP,"을 얻지 못하면 인수 RSP을 얻은 다음 인수 ""을 개별적으로 얻습니다.

관련 문제