Fungsi makro vs statis di Header

9

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.

Wirrbel
sumber
4
Saya pikir pertanyaan Anda mungkin telah dijawab di sini stackoverflow.com/questions/9104568/macro-vs-function-in-c dan di sini stackoverflow.com/questions/1358232/why-use-macros-in-c
Maru
menulis makro yang tepat adalah menyebalkan, dan inlinefungsinya hanya memastikan ia dapat didefinisikan beberapa kali dalam biner, kompiler dapat memutuskan apakah itu benar-benar akan membuatnya menghemat ruang
ratchet freak
2
Saya benar-benar akan curiga sebagian besar adalah alasan historis. Beberapa waktu yang lalu, kompiler C sama sekali tidak memiliki fungsi. Jadi orang menggunakan makro untuk hal-hal yang mereka inginkan sebaris. Kode C biasanya berumur panjang.
Jan Hudec
@ scratchetfreak: C tidak punya inline, ini bukan tentang C ++.
wirrbel
2
@ Wirrbel Tentu saja ada inlinedi C, setidaknya sejak C99. Untuk ikhtisar singkat, lihat Wikipedia tentang fungsi sebaris .
amon

Jawaban:

6

Makro yang dipecahkan oleh pemanggilan fungsi memiliki banyak jebakan:

  • Mereka sulit untuk ditulis, karena Anda mungkin harus menangani argumen yang tepat seperti ++i.
  • Mereka sulit untuk di-debug dengan visual debugger karena Anda tidak dapat melewati makro atau meletakkan breakpoint di sana.
  • Mereka sulit ditangani dengan benar ketika menganalisis dependensi kompilasi.

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.

Biasanya fungsi C tidak digarisbawahi karena mungkin ditautkan dari file C lainnya.

Tidak ada alasan mengapa kompiler tidak akan dapat menyediakan dua versi fungsi, yang tradisional calldan yang inlined. 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.)

pengguna40989
sumber