2012-12-12 5 views
9

내가 작업하고있는 일부 레거시 코드에는 함수 인수로 사용하기위한 쉼표로 구분 된 목록을 반환하는 매크로가 있습니다. 이것은보기 흉하지만 구성 파일에 이러한 파일이 많이 포함되어 있으므로 지금 변경하기가 어려울 수 있습니다.C++ 전 처리기에서 인수 나누기

#define XY1 0,0 
#define XY2 1,7 
... 

void fun_point(x,y); 

fun_point(XY1); 

이 기능은 호출되는 함수 인 한 올바르게 작동합니다. 매개 변수와 다른 매크로를 호출 할 때 그러나, 전체 문자열은 두 개의 인수

#define MAC_POINT(x,y) (x+y) 
MAC_POINT(XY1) #not expanded by preprocessor 

XY로 정의를 변경하지 않고이 문제에 대한 해결 방법은

에 쉼표 하나 개의 인수가 아닌 분할로 간주됩니다?

+2

는/나를 내가 토론 또는 GCC 설명서에서이 문제를 발견 레거시 코드 – icabod

+1

에 주먹을 흔들 : http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan – Quantum7

답변

13

킨다. 다음 작품 :

#define MAC_POINT(x,y) (x+y) 
#define MAC_POINT1(xy) MAC_POINT(xy) 
#define XY x,y 
MAC_POINT(x,y) 
MAC_POINT1(XY) 

그러나 당신은 단지 하나의 인자가있는 경우 MAC_POINT1에 MAC_POINT에서 변경해야합니다.

또 다른 가능성

은 이것이다 :

#define MAC_POINT(x,y) (x+y) 
#define MAC_POINT1(xy) MAC_POINT xy 
#define XY x,y 
MAC_POINT1((x,y)) 
MAC_POINT1((XY)) 

이제 매크로에 대한 모든 통화를 변경해야하지만, 적어도 그들은 일관성을.

+0

아 I 추가 수준의 간접 지정이 필요한 이유를 알았습니다. 감사! – Quantum7