Apakah ada cara untuk menyematkan pernyataan pragma di makro dengan pernyataan lain?
Saya mencoba mencapai sesuatu seperti:
#define DEFINE_DELETE_OBJECT(type) \
void delete_ ## type_(int handle); \
void delete_ ## type(int handle); \
#pragma weak delete_ ## type_ = delete_ ## type
Saya baik-baik saja dengan solusi boost (simpan untuk gelombang) jika ada.
c-preprocessor
pragma
stringification
Anycorn
sumber
sumber
Jawaban:
Jika Anda menggunakan c99 atau c ++ 0x ada operator pragma, digunakan sebagai
yang setara dengan
kecuali itu dapat digunakan dalam makro (lihat bagian 6.10.9 dari standar c99, atau 16.9 dari draf komite akhir c ++ 0x)
Sebagai contoh,
ketika dimasukkan ke dalam
gcc -E
memberisumber
__pragma()
operator preprocessor, yang sayangnya sedikit berbeda dari_Pragma()
operator C99 (C99 menggunakan literal string, MSVC mengambil token yang tidak dalam string): msdn.microsoft.com/en-us/library/d9x1s805 .aspxSatu hal baik yang dapat Anda lakukan dengan _Pragma ("argumen") adalah menggunakannya untuk menangani beberapa masalah kompilator seperti
sumber
Tidak, tidak ada cara portabel untuk melakukan itu. Selain itu, tidak ada cara portabel untuk menggunakan #pragma sama sekali. Karenanya, banyak compiler C / C ++ yang menentukan metodenya sendiri untuk melakukan hal-hal yang mirip pragma, dan mereka sering kali dapat disematkan di makro, tetapi Anda memerlukan definisi makro yang berbeda pada setiap kompiler. Jika Anda bersedia menempuh jalur itu, Anda sering kali akhirnya melakukan hal-hal seperti ini:
Jika tidak jelas Anda ingin mendefinisikan
Weak_b
danWeak_e
sebagai konstruksi bracketing begin-and-end karena beberapa kompiler seperti GCC menambahkan atribut sebagai tambahan untuk tanda tangan tipe, dan beberapa, seperti MSC menambahkannya sebagai awalan (atau setidaknya melakukannya sekali, sudah bertahun-tahun sejak saya menggunakan MSC). Memiliki bracketing contruct memungkinkan Anda untuk menentukan sesuatu yang selalu berfungsi, bahkan jika Anda harus meneruskan seluruh tanda tangan tipe ke dalam konstruksi kompilator.Tentu saja, jika Anda mencoba mem-porting ini ke kompiler tanpa atribut yang Anda inginkan, tidak ada yang dapat Anda lakukan selain membiarkan makro meluas dan berharap kode Anda tetap berjalan. Jika hanya memperingatkan atau mengoptimalkan pragma, ini mungkin terjadi. Dalam kasus lain, tidak terlalu banyak.
Oh, dan saya curiga Anda benar-benar perlu mendefinisikan Weak_b dan Weak_e sebagai makro yang mengambil parameter, tetapi saya tidak bersedia membaca dokumen tentang cara membuat definisi yang lemah hanya untuk contoh ini. Saya tinggalkan itu sebagai latihan untuk pembaca.
sumber
Tidak, Anda tidak dapat memasukkan pernyataan preprocessor ke dalam pernyataan preprocessor. Anda bisa, bagaimanapun, memasukkannya ke dalam sebuah
inline
fungsi. Itu mengalahkanC
labelnya.sumber
inline
, dan sebagian besar implementasi C89 memiliki beberapa variasi.inline
juga hal lain yang dipinjam C dari C ++!:)