3

我对下面的代码有一个链接器问题。它适用于 Visual Studio 2015 编译器,但不适用于 Visual Studio 中的 Clang/LLVM。我尝试了可能不同的变体(下面有一些),一切都很好。它似乎是static constexpr numeric_limits<double>and的特定组合REQUIRE

// quicktest.cpp

#include <limits>
#include <iostream>
#define CATCH_CONFIG_MAIN  // This tells Catch to provide a main() - only do this in one cpp file
#include <catch.hpp>

struct X {
    static constexpr double min = std::numeric_limits<double>::min();
    static constexpr int min_int = std::numeric_limits<int>::min();
};

SCENARIO("blah")
{
        static const double my_min = X::min;                // works
        std::cout << (5 > X::min) << std::endl;             // works
        REQUIRE(5 > my_min);                                // works
        REQUIRE(5 > X::min_int);                            // works (int)
        REQUIRE(5 > std::numeric_limits<double>::min());    // works

        //REQUIRE(5 > X::min);                              // lnk2019

}

//int main()
//{
//    std::cout << (X::min < 5) << std::endl; // works
//  return 0;
//}

最后REQUIRE评论的确切错误消息是: Error LNK2019 unresolved external symbol "public: static double const X::min" (?min@X@@2NB) referenced in function "intvoid __cdecl anonymous namespace'::dynamic initializer for 'autoRegistrar11''(void)'::1'::dtor$2" (?dtor$2@?0???__EautoRegistrar11@?A@@YAXXZ@4HA) quicktest ...\quicktest\quicktest.obj 1

幸运的是,解决方法很简单,但我想知道问题的确切原因是什么。实际上,我不知道它是源自 catch 还是源自编译器或其他任何东西。有人知道吗?

4

0 回答 0