2012-12-12 8 views
9

Einige Legacy-Code, an dem ich arbeite, hat ein Makro, das eine durch Kommas getrennte Liste zurückgibt, die als Funktionsargumente verwendet werden soll. Das ist hässlich, aber die Konfigurationsdatei enthält viele davon und es wäre schwierig, sie jetzt zu ändern.Splitten von Argumenten in C++ - Präprozessor

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

void fun_point(x,y); 

fun_point(XY1); 

Dies funktioniert gut, solange es eine Funktion aufgerufen wird. Wenn jedoch ein anderes Makro mit den Parametern aufzurufen versuchen, die gesamte Zeichenfolge als ein Argument betrachtet eher als Split im Komma in zwei Argumente

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

Gibt es eine Abhilfe für dieses Problem ohne die XY-Definitionen zu ändern?

+2

/Ich schüttelt Faust bei Legacy-Code – icabod

+1

Ich fand eine Diskussion oder dieses Problem in der GCC-Handbuch: http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan – Quantum7

Antwort

13

Irgendwie. Die folgenden Werke:

#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) 

Allerdings müssen Sie von MAC_POINT zu MAC_POINT1 ändern, wenn Sie nur ein Argument haben.

Eine andere Möglichkeit ist diese:

#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)) 

Jetzt müssen Sie dem Makro alle Anrufe ändern, aber zumindest sind sie konsistent.

+0

Ah, ich Ich denke, ich sehe, warum die zusätzliche Ebene der Indirektion notwendig ist. Vielen Dank! – Quantum7