Saya ingin menulis makro di C yang menerima sejumlah parameter, bukan angka tertentu
contoh:
#define macro( X ) something_complicated( whatever( X ) )
di mana X
sejumlah parameter
Saya perlu ini karena whatever
kelebihan beban dan dapat dipanggil dengan 2 atau 4 parameter.
Saya mencoba mendefinisikan makro dua kali, tetapi definisi kedua menimpa yang pertama!
Kompiler yang saya gunakan adalah g ++ (lebih khusus, mingw)
c
g++
c-preprocessor
variadic
Hasen
sumber
sumber
Jawaban:
Cara C99, juga didukung oleh VC ++ compiler.
sumber
##
tidak diperlukan dan tidak portabel.#define FOO(...) printf(__VA_ARGS__)
melakukan pekerjaan dengan cara portabel; yangfmt
parameter dapat dihilangkan dari definisi.__VA_ARGS__
adalah cara standar untuk melakukannya. Jangan gunakan hack khusus-kompiler jika Anda tidak perlu.Saya benar-benar kesal karena saya tidak dapat mengomentari posting asli. Bagaimanapun, C ++ bukan superset dari C. Ini benar-benar konyol untuk mengkompilasi kode C Anda dengan kompiler C ++. Jangan lakukan apa yang Donny tidak lakukan.
sumber
class
denganklass
mengizinkan kompilasi dengan kompiler C ++. Perhatikan juga bahwa ada beberapa perbedaan yang akan membuat Anda marah; misalnya, operator ternary tidak dievaluasi dengan cara yang sama dalam kedua bahasa, daninline
kata kunci berarti sesuatu yang sama sekali berbeda (seperti yang saya pelajari dari pertanyaan yang berbeda).Saya tidak berpikir itu mungkin, Anda bisa berpura-pura dengan double parens ... asalkan Anda tidak memerlukan argumen secara individual.
sumber
Jika kompiler tidak memahami makro variadic, Anda juga dapat menghapus PRINT dengan salah satu dari berikut ini:
atau
Komentar pertama mengeluarkan instruksi PRINT, yang kedua mencegah instruksi PRINT karena kondisi NULL if. Jika optimisasi diatur, kompiler harus menghapus instruksi yang tidak pernah dijalankan seperti: if (0) print ("hello world"); atau ((tidak berlaku) 0);
sumber
if
dari "jangan lakukan ini" yang memperhitungkan struktur kode adalah:if (0) { your_code } else
titik koma setelah ekspansi makro Anda mengakhirielse
. Thewhile
Versi terlihat seperti:while(0) { your_code }
Masalah dengando..while
versi adalah bahwa kode dalamdo { your_code } while (0)
dilakukan sekali, dijamin. Dalam ketiga kasus, jikayour_code
kosong, itu layakdo nothing gracefully
.menjelaskan untuk g ++ di sini, meskipun itu adalah bagian dari C99 jadi harus bekerja untuk semua orang
http://www.delorie.com/gnu/docs/gcc/gcc_44.html
contoh cepat:
sumber
__VA_ARGS__
, meskipun mereka didukung oleh kompiler di versi sebelumnya juga, sebagai ekstensi.