Menangani #defines dalam File IDL
Halaman ini menjelaskan mengapa simbol yang didefinisikan dengan #define menghilang dari kompilator MIDL yang menghasilkan file H, dan apa yang dapat dilakukan tentang hal itu. Penjelasan ini berlaku untuk file apa pun yang diproses oleh MIDL, seperti file *.idl, *.acf, *.h.
Hilangnya simbol #define adalah hasil dari MIDL yang mendelegasikan pra-pemrosesan file input ke pra-proses. Secara default, preproscessor adalah preproscessor C/C++ dari lingkungan build. Setelah praproscessing, aliran input yang diterima MIDL hanya memiliki #line arahan pra-prosesor. Secara khusus, prapemrosesan membatalkan semua definisi makro dalam file input, dan oleh karena itu, MIDL tidak dapat mendeteksi keberadaannya. Akibatnya, ketika MIDL mereplikasi definisi jenis dari file input ke file H yang dihasilkan, #defines tidak direplikasi. Oleh karena itu, jangan gunakan #defines langsung dalam file IDL jika akan digunakan nanti dari file H yang dihasilkan.
Empat solusi berikut disarankan:
- Gunakan spesifikasi deklarasi const .
- Gunakan file header terpisah yang diimpor atau disertakan dalam file IDL, dan kemudian disertakan dalam kode sumber C.
- Gunakan konstanta enumerasi dalam file IDL.
- Gunakan cpp_quote untuk mereprodusi #define dalam file header yang dihasilkan.
Anda dapat mereproduksi konstanta manifes menggunakan sintaks deklarasi konstanta IDL. Perhatikan bahwa konstanta dalam deklarasi konstanta IDL berbeda dari semantik kontraS C/C++, dan hanya memperkenalkan konstanta bernama untuk kompilasi IDL. Contohnya:
const short ARRSIZE = 10
Contoh ini menentukan bahwa ARRSIZE adalah konstanta dengan nilai 10. Konstanta bernama dapat digunakan dalam deklarator array IDL dan tempat lain di mana programmer C akan menggunakan definisi manifes. Selain itu, sintaks ini menghasilkan baris berikut yang dihasilkan dalam file header:
#define ARRSIZE 10
Cara lain untuk menangani pernyataan **#**define adalah dengan mengemasnya dalam file header terpisah, baik ke dalam file yang dikhususkan untuk **#**mendefinisikan pernyataan atau ke dalam file yang hanya berisi definisi jenis. File yang hanya berisi direktif pra-prosesor dapat disertakan dengan aman baik oleh file IDL maupun file sumber C. Meskipun arahan tidak akan tersedia dalam file header yang dihasilkan oleh pengkompilasi MIDL, program sumber C dapat menyertakan file header terpisah. Dengan cara yang sama, file header dengan **#**mendefinisikan pernyataan dan definisi jenis reguler dapat diimpor dari file IDL Anda. Pendekatan ini merangkum pernyataan **#**define dan typedef dengan menggunakannya dalam file H sehingga simbol **#**define tidak digunakan dalam mengimpor file IDL secara langsung. Mengimpor file header atau IDL ke file IDL lain mencegah pernyataan typedef direplikasi ke file H yang dihasilkan oleh MIDL (yang berbeda dengan **#**menyertakan pernyataan). Pendekatan ini memungkinkan file header asli dirujuk dengan aman dari kode C di sepanjang file H yang dihasilkan tanpa memiliki masalah dengan definisi duplikat.
Penggunaan konstanta enumerasi dalam file IDL juga efektif. Konstanta ini dapat digunakan dalam ekspresi konstanta di IDL, misalnya, dalam deklarator array. Konstanta enumerasi tidak dihapus selama fase awal kompilasi MIDL oleh pra-prosesor kompilator C, sehingga konstanta enumerasi tersedia dalam file header yang dihasilkan oleh kompilator MIDL. Pertimbangkan pernyataan berikut:
typedef enum midlworkaround { MAXSTRINGCOUNT = 300 };
Pernyataan ini tidak akan dihapus selama kompilasi MIDL oleh pra-prosesor C dan typedef akan direplikasi ke file H yang dihasilkan. MAXSTRINGCOUNT konstanta tersedia untuk program sumber C yang menyertakan file header yang dihasilkan oleh pengkompilasi MIDL.
Akhirnya, arahan cpp_quote MIDL dapat digunakan untuk menulis string arbitrer langsung ke file H yang dihasilkan. Misalnya, untuk mendapatkan konstanta manifes yang digunakan sebelumnya di halaman ini dengan cpp_quote, pernyataan berikut dapat digunakan:
cpp_quote ("#define ARRSIZE 10")
Pernyataan ini menghasilkan baris berikut yang dihasilkan dalam file header:
#define ARRSIZE 10