2016-05-16 31 views
-2

ich so etwas wie dieses, aber mit CMacro implementieren müssen:CMacro und Integer-Arithmetik

int a = //some constant; 
int x = //constant 
int c = //constant 
int y = a*x+b; 

ich so etwas versucht haben:

#define A 3 
#define X 6 
#define B 8 
#define Y ((A)*(X) + (B)) 

Allerdings, wenn ich die Fahne -E im gcc verwenden es zeigt mir 3*6 + 8.

Gibt es keine Möglichkeit, Ganzzahlarithmetik mit CMacro vor der Ersetzung zu verwenden?

Mein Ziel wäre so etwas wie, nur ein Stück Code sein ...:

#define func_impl(NY,NX,R) \ 
void func_#NY_#NX(int* y, int* x) { \ //x size NX, y size NY 
    int tmp[2*NX - R]; \ 
    for(int i = 0; i < 2*NX - R; i++) tmp[i] = 0; \ 
    //other processing operations... \ 
} 

Ich weiß sowohl NX, NY und R a priori, obwohl sie von einem anderen Programm erzeugt sind. Ich möchte also grundsätzlich vermeiden, dass das Programm P1 zu viele Makro-Konstanten generiert, wenn dies möglich ist.

+0

Gibt es einen Grund, warum Sie Makros in erster Linie brauchen? Warum können Sie keine generische Funktion schreiben oder alternativ ein Array von Funktionszeigern verwenden? Funktionsähnliche Makros, die Funktionen erzeugen, sind mit ziemlicher Sicherheit die falsche Lösung für irgendein bekanntes Programmierproblem. – Lundin

+0

Auch dieses '#define Y A * X + B' ist ein gewöhnlicher Anfänger-Bug, der wiederum vorschlägt, dass Sie sich vorerst von Makros fernhalten sollten. – Lundin

+0

^^ Ja, bis du mehr Erfahrung hast. Wenn Sie die Erfahrung haben, werden Sie wissen, dass Sie sich selbst von Makros fernhalten müssen. –

Antwort

1

Nein, Makros dienen nur als Textersatz, sonst nichts.

Die einzige Stelle, wo der Präprozessor Ausdrücke auswertet, ist in einem eigenen #if/#else Konstrukt. Aber dort könnte es tatsächlich ein bisschen anders sein, als Sie auf den ersten Blick denken, denn die Typen für Ganzzahlen sind immer [u]intmax_t.

2

Allerdings, wenn ich die Fahne -E im gcc verwenden es zeigt mir 3 * 6 + 8.

, die eigentlich in Ordnung, weil jeder anständige Compiler constant folding auf einem solchen Ausdruck perfom wird, so dass Sie‘ ll enden mit 26 innerhalb des Maschinencodes.

Ansonsten können Sie versuchen, eine static inline-Funktion zu verwenden, die typsicher ist. Makros sind ziemlich fehleranfällig und lassen sich nur schwer debuggen.