untuk banyak tugas cepat di mana seseorang dapat menggunakan suatu fungsi f(x,y)
, di C polos, makro digunakan. Saya ingin bertanya secara khusus tentang kasus-kasus ini, yang dipecahkan oleh pemanggilan fungsi (yaitu makro yang digunakan untuk fungsi inlining, bukan untuk perluasan kode dari kode arbitrer).
Biasanya fungsi C tidak digarisbawahi karena mungkin ditautkan dari file C lainnya. Namun, fungsi C statis hanya terlihat dari dalam file C yang didefinisikan. Oleh karena itu mereka dapat digarisbawahi oleh kompiler. Saya telah mendengar bahwa banyak makro harus diganti dengan mengubahnya menjadi fungsi statis, karena ini menghasilkan kode yang lebih aman.
Apakah ada kasus di mana ini bukan ide yang baik?
Sekali lagi: Tidak bertanya tentang makro Kode-Produksi dengan ## konstruksi yang sama sekali tidak dapat dinyatakan sebagai fungsi.
inline
fungsinya hanya memastikan ia dapat didefinisikan beberapa kali dalam biner, kompiler dapat memutuskan apakah itu benar-benar akan membuatnya menghemat ruanginline
, ini bukan tentang C ++.inline
di C, setidaknya sejak C99. Untuk ikhtisar singkat, lihat Wikipedia tentang fungsi sebaris .Jawaban:
Makro yang dipecahkan oleh pemanggilan fungsi memiliki banyak jebakan:
++i
.Makro yang dipecahkan oleh pemanggilan fungsi bisa berguna untuk menyediakan inlining dalam kompiler primitif. Saya tidak mengetahui adanya kompiler yang tidak menangani fungsi inline dan beberapa bahkan dapat inline di seluruh unit kompilasi.
Tidak ada alasan mengapa kompiler tidak akan dapat menyediakan dua versi fungsi, yang tradisional
call
dan yanginline
d. Anda harus melihat dokumentasi kompiler yang Anda targetkan. Juga, Anda mungkin ingin melihat rakitan yang dihasilkan: bahkan jika Anda tidak tahu rakitan, Anda dapat dengan cepat belajar untuk mengetahui apakah beberapa fungsi telah diuraikan atau tidak. (Mulailah dengan contoh bayi untuk mempelajari ini dengan cepat.)sumber