Saturday, May 2, 2015

Bài viết này hướng dẫn sử dụng preprocessors để giải quyết các vấn đề gặp phải trong thực tế làm việc như dưới đây:
1. Trong quá trình code chuyện debug là điều không thể tránh khỏi, tuy nhiên chương trình realease cuối cùng phải tắt hết các dòng lệnh debug ra khỏi chương trình, vậy làm thế nào để làm được điều đó ?
2. Làm thế nào để add/remove, hoặc switch qua lại giữa các tính năng trong quá trình phát triển chương trình ban đầu cũng như sau này ra các bản update ?
3. Một vài thủ tục có nhiều dùng code mà lại cần lặp đi lặp lại thủ tục đó, vậy làm sao để làm cho chương trình sáng sủa và đẹp mắt trong khi vẫn thực hiện đúng chức năng ?

Trước hết xem lại Preprocessors.
#if, #ifdef, #ifndef, defined( ) thường được sử dụng nhiều nhất.

Ex
debug.h

 #ifndef DEBUG_H_  
 #define DEBUG_H_  
 #include <stdio.h>  
   
 #if 1  /* 1: enable, 0: disable debug  */
 #define DBG(x...) {printf("\e[033;34m%s<%d> \e[0m",__FUNCTION__,__LINE__); printf(x);}  
 #define FATAL(x...) {printf("\e[033;31m%s<%d> \e[0m",__FUNCTION__,__LINE__); printf(x);}  
 #else  
 #define DBG(x...)  
 #define FATAL(x...)  
 #endif  
   
 #endif /* DEBUG_H_ */  
   

main.c

 #include <stdio.h>  
 #include "debug.h"  
   
   
 #define D_FEATURE_1  
 //#define D_FEATURE_2  
 #define D_FEATURE_3  
   
 #define D_FEATURE_4 1  
   
   
 #define PRINT_MAX(a, b) \  
   if(a > b){ \  
     DBG("MAX = a = : %d \n", a); \  
   }else{ \  
     DBG("MAX = b = : %d \n", b); \  
   }  
   
   
 int main()  
 {  
   
   int speed = 10;  
   
   if(speed < 0){  
     FATAL("fail ! \n");  
     speed = 0;  
   }else{  
     DBG("speed: %d \n", speed);  
     speed++;  
   }  
   
   
 #ifdef D_FEATURE_1  
   DBG("code for D_FEATURE_1 \n")  ;  
 #endif  
   
 #ifdef D_FEATURE_2  
   DBG("code for D_FEATURE_2 \n")  ;  
 #endif  
   
 #if defined(D_FEATURE_3)  
   DBG("code for D_FEATURE_3 \n")  ;  
 #endif  
   
 #if (D_FEATURE_4 == 1)  
   DBG("code for D_FEATURE_4 \n")  ;  
 #endif  
   
   
   PRINT_MAX(1, 2);  
   PRINT_MAX(3, 2);  
   PRINT_MAX(10, 20);  
   PRINT_MAX(11, 2);  
   
   return 0;  
 }  
   
   
   

Compile & Execute
 $ gcc debug.h main.c   
 $ ./a.out   
main<29> speed: 10 
main<35> code for D_FEATURE_1 
main<43> code for D_FEATURE_3 
main<47> code for D_FEATURE_4 
main<51> MAX = b = : 2 
main<52> MAX = a = : 3 
main<53> MAX = b = : 20 
main<54> MAX = a = : 11    
   


1. Hàm printf được gói gọn trong define DBGFATAL, được bật tắt dễ dàng bằng cách sửa lại #if 1 hoặc #if 0 trong file debug.h
2. Các tính năng được add/remove nhờ các define  
D_FEATURE_1, D_FEATURE_2, D_FEATURE_3, D_FEATURE_4, ...

3. Một vd đơn giản cho việc sử dụng #define để rút gon source một cách ngắn gọn khi gặp các thủ tục giống nhau và lặp đi lặp lại  PRINT_MAX

Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © Lập trình hệ thống nhúng Linux . Powered by Luong Duy Ninh -