- Back to Home »
- Programming techniques »
- C/C++ Sử dụng tiền xử lý - preprocessors
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 DBG và FATAL, đượ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