【问题标题】:Constant strings initialized as empty初始化为空的常量字符串
【发布时间】: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


【解决方案1】:

U.W. 使用 consexpr auto 的建议有所帮助。我不确定 std::string 有什么问题,但现在 constexpr 可以。

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2018-09-27
    • 1970-01-01
    相关资源
    最近更新 更多