【发布时间】:2021-05-25 12:17:32
【问题描述】:
我正在处理一些神秘的事情,或者我的想法不正确。详细信息如下,为了简洁起见,我推迟了所有 usings-s、#include-s 等。我的代码编译得很好。
伪代码:
File: Constants.hpp
namespace TestConstants
{
const std::string TEST = "Test";
}
File: Program.cpp
#include "Constants.hpp"
void Program::Foo()
{
// do something with TestConstants::TEST here.
}
File: ProgramTest.cpp
#include "Program.hpp"
BOOST_FIXTURE_TEST_CASE(SomeTest, TestFixture)
{
Program p;
p.Foo();
}
问题:当我运行测试时,TestConstants::TEST 字符串在 Program::Foo() 中初始化为 "",而如果我按 Ctrl+F5,字符串常量包含预期值并且代码运行良好。我在这两种情况下都通过调试验证了这一点。如果我尝试在测试本身中访问字符串常量,它会正确初始化,但当我进入 Program::Foo() 时它仍然为空。
我在 Windows 10 机器上使用 Visual Studio。
测试本身不做任何设置,更不用说弄乱常量字符串了。我对我可能会错过什么一无所知。
【问题讨论】:
-
尝试在测试用例的主要实例中使用它。初始化顺序可能存在任何问题,这意味着您的代码在初始化之前正在运行。
-
如果你使用 C++17,你可以尝试使用
inline关键字来代替TEST,像这样:inline const std::string TEST = "Test"; -
您使用哪种环境?操作系统、编译器版本等???
-
哦,
constexpr代替const有帮助吗? -
@U.W. constexpr 帮助。我想我会接受它,但仍然无法解释 const string 可能有什么问题。我怀疑与字符串初始化的顺序有关。
标签: c++ visual-c++ boost-test