Ich möchte ein Makro zur Kompilierzeit basierend auf dem Wert eines anderen Makros definieren. Allerdings wird dieser Code nicht wie erwartet ausgeführt wird:Weird Makrodefinition Problem
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIXTEEN 16
#define TWO (SIXTEEN % 8 == 0)? (SIXTEEN/8) : ((SIXTEEN/8) + 1)
int main();
int main() {
printf("max = %d\n", TWO);
int i;
for (i = 0; i < TWO; i++) {
printf("%d\n", i);
}
return 0;
}
Diese Drucke:
max = 2
0
1
2
...
und fährt fort, bis sie beendet, wenn es einfach Drucken werden sollten:
max = 2
0
1
und Aussteigen.
Wenn ich diese stattdessen tun, es funktioniert:
#define TWO 2
Ich dachte, dass dies ein Problem mit der Definition der Makro war ... aber wenn ich folgendes mit dem ursprünglichen #define tun, es scheint Arbeit:
...
int count = TWO;
for (i = 0; i < count; i++) {
...
Kann mir jemand erklären, was hier vor sich geht?
+1 für mich um 37 Sekunden zu schlagen. = ( –
+1) Die allgemeine Faustregel lautet: Wenn Ihr Makro in einen Ausdruck expandieren soll, stellen Sie sicher, dass es in einem (übereinstimmenden) Paar von Parens eingeschlossen ist. Die einzige Ausnahme ist, wenn es garantiert zu einem einzigen Token erweitert wird (wie das SECHZEHN Makro des OP). –