gpt4 book ai didi

c++ - 如何使 `static_assert`打印失败时得到的值?

转载 作者:行者123 更新时间:2023-12-01 14:43:47 26 4
gpt4 key购买 nike

运行此:

#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)

template< int PathLength >
constexpr const int startfindlastslash(const char (&path)[PathLength]) {
return PathLength;
}

int main(int argc, char const *argv[])
{
STATIC_ASSERT( startfindlastslash( "cppdebugger/test_debugger.cpp" ) == 11 );
}

你得到了:
  • g++ -o main.exe --std=c++14 test_debugger.cpp
    test_debugger.cpp: In function ‘int main(int, const char**)’:
    test_debugger.cpp:1:28: error: static assertion failed: startfindlastslash( "cppdebugger/test_debugger.cpp" ) == 11
    #define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
    ^
    test_debugger.cpp:10:5: note: in expansion of macro ‘STATIC_ASSERT’
    STATIC_ASSERT( startfindlastslash( "cppdebugger/test_debugger.cpp" ) == 11 );
    ^~~~~~~~~~~~~
  • clang++ -Xclang -ast-print -fsyntax-only --std=c++14 test_debugger.cpp > main.exe
    test_debugger.cpp:10:5: error: static_assert failed due to requirement 'startfindlastslash("cppdebugger/test_debugger.cpp") == 11' "startfindlastslash(
    \"cppdebugger/test_debugger.cpp\" ) == 11"
    STATIC_ASSERT( startfindlastslash( "cppdebugger/test_debugger.cpp" ) == 11 );
    ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    test_debugger.cpp:1:28: note: expanded from macro 'STATIC_ASSERT'
    #define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
    ^ ~~~~~~~~~~~
    1 error generated.

  • 编译器没有告诉它应该获得哪个值,而只是说该值不相等。

    最佳答案

    我经常发现将static_asserts包装在功能模板中很有用。然后,编译器将至少在错误消息中打印功能模板参数。如果将此策略与@ Phil1970的值模板方法结合使用,则将获得相当不错的结果。

    使用GCC编译时,以下代码片段将显示包含您的值的错误消息:In instantiation of 'constexpr void assert_equal(const_val<T, A>, const_val<U, B>) [with T = int; T A = 30; U = int; U B = 11]'
    lang声更好:<source>:13:5: error: static_assert failed due to requirement '30 == 11' "Values are not equal!"

    #define MAKE_CONST(x) const_val<decltype(x), x>{}
    #define STATIC_ASSERT_EQUAL(x, y) assert_equal(MAKE_CONST(x), MAKE_CONST(y));

    template<typename T, T val>
    struct const_val {
    constexpr const_val() = default;
    constexpr const_val(T v) {}
    };

    template<typename T, T A, typename U, U B>
    constexpr void assert_equal(const_val<T, A>, const_val<U, B>) {
    static_assert(A == B, "Values are not equal!");
    }

    template< int PathLength >
    constexpr const int startfindlastslash(const char (&path)[PathLength]) {
    return PathLength;
    }

    int main(int argc, char const *argv[])
    {
    STATIC_ASSERT_EQUAL(startfindlastslash( "cppdebugger/test_debugger.cpp" ), 11);
    }

    它不完全是您使用的语法,并且为方便起见还包含一个附加的宏,但希望它足以满足您的目的...

    实时代码 here

    关于c++ - 如何使 `static_assert`打印失败时得到的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59473672/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com