Rumah > pembangunan bahagian belakang > C++ > Adakah terdapat amaran statik bersamaan dengan `static_assert` yang menghasilkan amaran dan bukannya menghentikan kompilasi?

Adakah terdapat amaran statik bersamaan dengan `static_assert` yang menghasilkan amaran dan bukannya menghentikan kompilasi?

DDD
Lepaskan: 2024-10-31 20:01:29
asal
355 orang telah melayarinya

Is there a static warning equivalent to `static_assert` that produces a warning instead of halting compilation?

Adakah Terdapat Amaran Statik?

Soalan ini bertujuan untuk menentukan sama ada mekanisme wujud untuk melaksanakan amaran statik serupa dengan static_assert, tetapi bukannya menghentikan kompilasi, ia mencetuskan mesej amaran semasa penyusunan.

Pelaksanaan

Menggunakan cerapan yang diberikan oleh ulasan daripada Michael E, pelaksanaan berikut dicadangkan:

<code class="c++">#if defined(__GNUC__)
#define DEPRECATE(foo, msg) foo __attribute__((deprecated(msg)))
#elif defined(_MSC_VER)
#define DEPRECATE(foo, msg) __declspec(deprecated(msg)) foo
#else
#error This compiler is not supported
#endif

#define PP_CAT(x,y) PP_CAT1(x,y)
#define PP_CAT1(x,y) x##y

namespace detail
{
    struct true_type {};
    struct false_type {};
    template <int test> struct converter : public true_type {};
    template <> struct converter<0> : public false_type {};
}

#define STATIC_WARNING(cond, msg) \
struct PP_CAT(static_warning,__LINE__) { \
  DEPRECATE(void _(::detail::false_type const&amp; ),msg) {}; \
  void _(::detail::true_type const&amp; ) {}; \
  PP_CAT(static_warning,__LINE__)() {_(::detail::converter<(cond)>());} \
}

// Note: using STATIC_WARNING_TEMPLATE changes the meaning of a program in a small way.
// It introduces a member/variable declaration.  This means at least one byte of space
// in each structure/class instantiation.  STATIC_WARNING should be preferred in any 
// non-template situation.
//  'token' must be a program-wide unique identifier.
#define STATIC_WARNING_TEMPLATE(token, cond, msg) \
    STATIC_WARNING(cond, msg) PP_CAT(PP_CAT(_localvar_, token),__LINE__)</code>
Salin selepas log masuk

Invokasi

Makro boleh digunakan pada berbilang skop, termasuk ruang nama, struktur dan fungsi. Berikut ialah contoh:

<code class="c++">#line 1
STATIC_WARNING(1==2, "Failed with 1 and 2");
STATIC_WARNING(1<2, "Succeeded with 1 and 2");

struct Foo
{
  STATIC_WARNING(2==3, "2 and 3: oops");
  STATIC_WARNING(2<3, "2 and 3 worked");
};

void func()
{
  STATIC_WARNING(3==4, "Not so good on 3 and 4");
  STATIC_WARNING(3<4, "3 and 4, check");
}

template <typename T> struct wrap
{
  typedef T type;
  STATIC_WARNING(4==5, "Bad with 4 and 5");
  STATIC_WARNING(4<5, "Good on 4 and 5");
  STATIC_WARNING_TEMPLATE(WRAP_WARNING1, 4==5, "A template warning");
};

template struct wrap<int>;</code>
Salin selepas log masuk

Hasil Penyusunan

Dengan amaran pengkompil yang sesuai didayakan, pelaksanaan yang disediakan menghasilkan mesej amaran pada masa penyusunan, menyampaikan mesej yang ditentukan:

GCC 4.6:

static_warning1::_: Failed with 1 and 2
Foo::static_warning6::_: 2 and 3: oops
func()::static_warning12::_: Not so good on 3 and 4
wrap<T>::static_warning19::_: Bad with 4 and 5
Salin selepas log masuk

Visual C 2010:

'static_warning1::_': Failed with 1 and 2
'Foo::static_warning6::_': 2 and 3: oops
'func::static_warning12::_': Not so good on 3 and 4
'wrap<T>::static_warning19::_': Bad with 4 and 5
Salin selepas log masuk

Denting 3.1:

'_' is deprecated: Failed with 1 and 2
'_' is deprecated: 2 and 3: oops
'_' is deprecated: Not so good on 3 and 4
'_' is deprecated: Bad with 4 and 5
Salin selepas log masuk

Atas ialah kandungan terperinci Adakah terdapat amaran statik bersamaan dengan `static_assert` yang menghasilkan amaran dan bukannya menghentikan kompilasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan