在作業了 10 多年之后,今天有一段代碼引起了我的注意,我無法理解函式內部定義的函式名稱會列印在輸出/日志中,而不是作為宏中的引數傳遞或定義為全域變數。請幫助我了解內部。請參閱螢屏截圖以供參考。
/*...*/
#include <stdio.h>
#define x printf("%s", f);
int main() {
char *f = "MAIN";
printf("Hello World");
x;
return 0;
}
輸出:
Hello WorldMAIN
uj5u.com熱心網友回復:
C 前處理器宏只是簡單地進行文本替換。他們對您的程式沒有語意意識。
這個:
#include <stdio.h>
#define x printf("%s", f);
int main()
{
char* f = "MAIN";
printf ("Hello World");
x;
return 0;
}
變成:
#include <stdio.h>
int main()
{
char* f = "MAIN";
printf ("Hello World");
printf("%s", f);;
return 0;
}
請注意,如果使用此宏時沒有f宣告,您將看到編譯器錯誤。如果f已宣告,但不是 a char *,您應該會看到編譯器警告。
一些前處理器宏最佳實踐包括(但不限于)使用大寫名稱,因為按照x慣例,它看起來像變數或函式名稱;并注意;您在宏文本中包含哪些語法上重要的符號(在這種情況下)。
希望這個例子是為了學習而完成的,因為它完全沒有必要。如果前處理器宏沒有任何用途,它們就不會存在,但要注意它們很容易混淆代碼。
uj5u.com熱心網友回復:
前處理器宏只是文本替換。所有#include陳述句都替換為指定檔案的內容。所有出現的#define'd 符號都將替換為其指定的文本。省略所有注釋。ETC...
因此,在您的示例中:
/*...*/
#include <stdio.h>
#define x printf("%s", f);
int main() {
char *f = "MAIN";
printf("Hello World");
x;
return 0;
}
在處理過的代碼被發送到編譯器之前,前處理器會用x文本替換所有實體。printf("%s", f);所以,這是編譯器實際看到的代碼:
// contents of <stdio.h> here...
int main() {
char *f = "MAIN";
printf("Hello World");
printf("%s", f);;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/524597.html
標籤:Cc-预处理器
下一篇:指標值遞增究竟是如何作業的?
