c语言ok未定义标识符,C语言中宏的相关知识 - osc_y7ckpzr9的个人空间 - OSCHINA - 中文开源技术交流社区...
2019/04/27 16:02 1.宏的定義:宏定義就是預處理命令的一種,它允許用一個標識符來表示一個字符串。格式如下:
#define name(宏名) stuff(字符串)
本質就是使用宏名去替代字符串的內容,注意是原封不動的替換,不要自己潛意識加上其他的括號啊之類的。 #define宏名 字符串#表示這是一條預處理命令,所有的預處理命令都以#開頭。define是預處理命令。宏名是標識符的一種,命名規則和標識符相同。字符串可以是常數、表達式等。 可以發現宏只對宏定義后的行數起作用,且與定義在哪里無關,即使函數不被調用,也可以使用宏。 宏函數不能出現遞歸。 宏定義的符號,即name部分不會在預處理替換的時候被搜索。 宏定義是#define后面不需要加上“;”,不然分號也會被替代進去。 2.宏函數的申明: 宏函數申明格式:
#define name ( parament-list ) stuff
parament-list為參數表,可以包含多個參數,他們會在stuff出現
#的用法 首先要理解一個原則,即鄰近字符串連接原則 在C語言中 printf(“hello”” world!”“\n”); 這句話是合法的 打印結果為: hello world!
#define PRINT(FORMAT, VALUE) printf("the value of " #VALUE " is "FORMAT"\n", VALUE)
int main()
{
int i = 0;
PRINT("%d", i + 3);
return 0;
}
所以我們可以看出來#的作用: 將一個宏參數變成一個對應的字符串 在上述例子中: #VALUE被替換成了“i + 3” 別忘了被替換的時候i + 3兩邊加上了雙引號 ##的用法
#define ADD_TO_AN(num, value) a##num += value
int main()
{
int a1 = 0;
int a2 = 0;
ADD_TO_AN(1, 5);
ADD_TO_AN(2, 6);
return 0;
}
解釋一下上面這段代碼
假設有一個變量叫a1
此時代碼片段為ADD_TO_AN(1, 5)
即替換為a1 += 5,給a1變量增加5
同理ADD_TO_AN(2, 6)則替換成a2 += 6
##的作用 將##兩邊的字符連在一起作為一個標識符 前提連接后的標識符必須合法,否則編譯出現標識符未定義
宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的替換。字符串中可以含任何字符,可以是常數,也可以是表達式,預處理程序對它不作任何檢查,如有錯誤,只能在編譯已被宏展開后的源程序時發現。
宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起替換。
宏定義必須寫在函數之外,其作用域為宏定義命令起到源程序結束。如要終止其作用域可使用#undef命令。
宏名在源程序中若用引號括起來,則預處理程序不對其作宏代換,例如:
#include #define OK 100
int main()
{
printf("OK\n");
return 0;
}
該例中定義宏名OK表示100,但在 printf 語句中 OK 被引號括起來,因此不作宏代換,而作為字符串處理。 5) 宏定義允許嵌套,在宏定義的字符串中可以使用已經定義的宏名,在宏展開時由預處理程序層層代換。 6) 習慣上宏名用大寫字母表示,以便于與變量區別。但也允許用小寫字母。 7) 可用宏定義表示數據類型,使書寫方便。例如:#define UINT unsigned int 在程序中可用UINT作變量說明:UINT a, b; 應注意用宏定義表示數據類型和用typedef定義數據說明符的區別。宏定義只是簡單的字符串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對類型說明符重新命名。被命名的標識符具有類型定義說明的功能。
總結
以上是生活随笔為你收集整理的c语言ok未定义标识符,C语言中宏的相关知识 - osc_y7ckpzr9的个人空间 - OSCHINA - 中文开源技术交流社区...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言选择题答案在哪查,C语言选择题及答
- 下一篇: printf sizeof c语言,你可