程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言使用宏所遇到的一點問題

C語言使用宏所遇到的一點問題

編輯:關於C
個人感覺比較有意思,所以就記下來了。 關於宏的使用原則,第一條就是永遠都不要使用宏。 但是就實際情況而言,除非是極小的程序,否則不使用宏是不可能的。 關於使用宏的好處有: (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] 這本身是很簡單的問題,但卻有時候不小心就帶來了問題。 所以將這鮮活的案例總結下來,希望自己能夠做的更好;而不是把時間浪費在發生問題之後的調試上。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved