個人感覺比較有意思,所以就記下來了。
關於宏的使用原則,第一條就是永遠都不要使用宏。
但是就實際情況而言,除非是極小的程序,否則不使用宏是不可能的。
關於使用宏的好處有:
(1)在程序編譯期間即可根據需要按需配置程序功能;
(2)定義一些有意義的常量宏有助於增加代碼的可讀性,以及減小代碼維護的代價。
宏會在預編譯階段被替換掉。
要小心的是,一定要在使用宏之前就將宏定義好。
與宏比較相似的一個東西就是inline函數,inline函數的優點有:
(1)在編譯階段會進行類型檢查;
(2)在編譯階段會直接將inline函數代碼展開到調用處,所以不存在函數調用的開銷。
inline函數通常適合應用於那些短小的函數中,否則可能會造成程序的size變大。
本人遇到的一個情況就是,由於文件比較大,所以一不小心被注意導致宏定義沒有放到
所有使用宏的地方的最前面,從而造成運行程序時出現不預期的結果。
測試代碼如下:
#include <stdio.h>
#ifdef ENABLE_FEATURE
int i_g_value = 1;
#else
int i_g_value = 2;
#endif
#define ENABLE_FEATURE
int main(int argc, char* argv[])
{
printf("\ni_g_value=%d\n", i_g_value);
return 0;
}
[sh] gcc -o macro_test_main macro_test_main.c
[sh] ./macro_test_main
i_g_value=2
[sh]
這顯然不是預期的結果。
於是修改程序如下:
#include <stdio.h>
#define ENABLE_FEATURE
#ifdef ENABLE_FEATURE
int i_g_value = 1;
#else
int i_g_value = 2;
#endif
int main(int argc, char* argv[])
{
printf("\ni_g_value=%d\n", i_g_value);
return 0;
}
[sh] gcc -o macro_test_main macro_test_main.c
[sh] ./macro_test_main
i_g_value=1
[sh]
這本身是很簡單的問題,但卻有時候不小心就帶來了問題。
所以將這鮮活的案例總結下來,希望自己能夠做的更好;而不是把時間浪費在發生問題之後的調試上。