我所做的代碼片斷簡單解釋C預處理器如何實際工作?
// 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
第一個是直觀的,而種編碼存在在幾個地方如查找最大或最小數。但是,我想用這種技術使我的代碼變得簡潔易讀,所以我用一個更短且更有意義的名稱替換了宏中的一些單詞。
AFAIK,C預處理器每個編譯單元只運行一次,只執行字符串替換,但爲什麼print_score
不能擴展爲printf("%d\n", 80);
?
這是在更換過程我想:
#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),所以這就是問題所在。 – BlackMamba
@BlackMamba第一次將'print_score(student_exam_score)printf(「%d \ n」,score)'替換爲'print_score(student_exam_score)printf(「%d \ n」,student_exam_score)'嗎? –
「* C預處理器每個編譯單元只運行一次*」和「*爲什麼'print_score'不能擴展爲'printf(」%d \ n「,80);'?*」後者正是因爲前者。 – alk