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
307 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!

sumber:php.cn
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