Xedi.Xermawan's Blog

personal-technical blog

Posts Tagged ‘preprocessors

#define problem

leave a comment »

Masalah kecil tapi fatal di projects C/C++ yang  saya temui ( dan parahnya terulang-ulang ), adalah penggunaan define. #define secara salah digunakan karena dicampur aduk antara definisi & pengecekannya. sebagai contoh ada 2 define :

#define USE_FEATURE_A
#define USE_FEATURE_B (1)

Dalam penggunaanya ada beberapa kemungkinan :

#ifdef USE_FEATURE_A
// code_inside_a.1
#endif
–>penggunaan yang benar. code “code_inside_a.1” akan ter-compile jika USE_FEATURE_A ter-define. kalau ingin menghilangkan code “code_inside_a.1”, USE_FEATURE_A harus un-define dengan komen : // #define USE_FEATURE_A

#if USE_FEATURE_A
// code_inside_a.2
#endif
–> salah. dan langsung kelihatan ( compile error ) jadi tidak perlu kawatir.

#if defined(USE_FEATURE_A)
// code_inside_a.3
#endif
–> benar. code “code_inside_a.3” akan ter-compile jika USE_FEATURE_A ter-define. kalau ingin menghilangkan code “code_inside_a.3”, USE_FEATURE_A harus un-define dengan komen : // #define USE_FEATURE_A

#if USE_FEATURE_B
// code_inside_b.1
#endif
–> benar. code “code_inside_b.1” ter-compile jika #define USE_FEATURE_B (1)

#if USE_FEATURE_B == 0
// code_inside_b.2
#endif
–>benar. code “code_inside_b.2” ter-compile jika #define USE_FEATURE_B (0)

#if defined(USE_FEATURE_B)
// code_inside_b.3
#endif
->salah. walaupun “code_inside_b.3” akan ter-compile ketika #define USE_FEATURE_B (1), namun “code_inside_b.3” juga akan ter-compile jika #define USE_FEATURE_B (0)

#ifdef USE_FEATURE_B
// code_inside_b.4
#endif
–>salah. walaupun “code_inside_b.4” akan ter-compile ketika #define USE_FEATURE_B (1), namun “code_inside_b.4” juga akan ter-compile jika #define USE_FEATURE_B (0)

best practice paling baik menurut saya memakai #define USE_FEATURE_B (1) dan secara konsisten menggunakan #if untuk mengecek.

 

Written by XediXermawan

May 21, 2014 at 5:22 pm

Posted in C/C++ Diary

Tagged with ,