Bolehkah saya Melaksanakan "Amaran Statik" untuk Memancarkan Amaran pada Masa Penyusunan?
Static_assert dalam C 11 ialah alat yang berharga untuk mengenal pasti ralat pada masa penyusunan. Walau bagaimanapun, ia hanya menghasilkan ralat kompilasi, bukan amaran. Soalan ini meneroka kemungkinan melaksanakan "amaran_statik" yang mengeluarkan amaran dan bukannya membatalkan kompilasi.
Pelaksanaan Berkemungkinan Menggunakan Makro
Menarik inspirasi daripada ulasan Michael E, yang canggih penyelesaian dicadangkan menggunakan makro:
<code class="cpp">#define DEPRECATE(foo, msg) foo __attribute__((deprecated(msg))) // GCC #define DEPRECATE(foo, msg) __declspec(deprecated(msg)) foo // MSVC</code>
Makro tambahan diperkenalkan untuk memudahkan penciptaan amaran statik:
<code class="cpp">#define STATIC_WARNING(cond, msg) ... #define STATIC_WARNING_TEMPLATE(token, cond, msg) ...</code>
Contoh Penggunaan
Makro boleh digunakan dalam pelbagai skop:
<code class="cpp">STATIC_WARNING(1==2, "Failed with 1 and 2"); STATIC_WARNING(..., "2 and 3 worked"); struct Foo { STATIC_WARNING(..., "2 and 3: oops"); }; void func() { STATIC_WARNING(..., "Not so good on 3 and 4"); } template <typename T> struct wrap { STATIC_WARNING_TEMPLATE(WRAP_WARNING1, ..., "A template warning"); };</code>
Output dalam Penyusun Berbeza
Menyusun kod contoh dengan pelbagai penyusun menghasilkan amaran seperti yang dijangkakan:
GCC 4.6:
warning: ‘void static_warning1::_(const detail::false_type&)’ is deprecated ...
Visual C 2010:
warning C4996: 'static_warning1::_': Failed with 1 and 2
Clang 3.1:
warning: '_' is deprecated: Failed with 1 and 2 ...
Kesimpulan
Makro yang dibentangkan menyediakan pendekatan yang canggih untuk melaksanakan ciri static_warning yang mengeluarkan amaran dan bukannya menyebabkan ralat penyusunan. Ia ialah alat yang berguna untuk nyahpepijat dan mengesan pengkhususan templat yang kompleks semasa penyusunan.
Atas ialah kandungan terperinci Bolehkah Kami Memancarkan Amaran Masa Kompilasi Seperti `static_assert` dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!