Ich machte das Code-Snippet einfacherWie funktioniert C Präprozessor tatsächlich?
// Example 1
#define sum2(a, b) (a + b)
#define sum3(a, b, c) (sum2(a, sum2(b, c)))
sum3(1, 2, 3) // will be expanded to ((1 + (2 + 3)))
// Example 2
#define score student_exam_score
#define print_score(student_exam_score) printf("%d\n", score)
#undef score
print_score(80); // will be expanded to printf("%d\n", score);
// but not printf("%d\n", 80); that I expect
Die erste ist intuitiv, zu erklären, und dass Arten von Codes existiert in mehreren Orten wie die maximale oder minimale Anzahl zu finden. Allerdings möchte ich diese Technik verwenden, um meinen Code sauber und leicht lesbar zu machen, also ersetze ich die Wörter in einem Makro durch einen kürzeren und aussagekräftigeren Namen.
AFAIK, C-Präprozessor wird nur einmal pro Kompilierungseinheit ausgeführt und führt nur Stringersatz durch, aber warum print_score
kann nicht auf printf("%d\n", 80);
erweitert werden?
Dies ist die Ersetzungsprozedur ich denke:
#define score student_exam_score
#define print_score(student_exam_score) printf("%d\n", score)
#undef score
print_score(80);
// -->
#define score student_exam_score // runs this first
#define print_score(student_exam_score) printf("%d\n", student_exam_score) // changed
#undef score
print_score(80);
// -->
#define score student_exam_score
#define print_score(student_exam_score) printf("%d\n", student_exam_score) // then this
#undef score
printf("%d\n", 80); // changed
print_score (80); => printf ("% d \ n", score) => printf ("% d \ n", student_exam_score), das ist das Problem. – BlackMamba
@BlackMamba Wird 'print_score (student_exam_score) printf ("% d \ n ", score)' nicht durch 'print_score (student_exam_score) printf ("% d \ n ", student_exam_score)' zuerst ersetzt? –
"* C-Präprozessor läuft nur einmal pro Kompilierungseinheit *" und "* warum' print_score' kann nicht auf 'printf ("% d \ n ", 80) erweitert werden;'? * "Letzteres liegt genau an ersterem. – alk