【发布时间】:2020-09-12 04:44:29
【问题描述】:
我将 std::string 传递给从 boost-program-options dll 导入的函数。该函数接受一个参数,它是对字符串的 const 引用。但是,函数接收的值与我传递的值不同。这是最小的代码
#include "boost/program_options.hpp"
int main()
{
std::string s = "This is a string";
auto res = boost::program_options::to_internal(s);
}
这是函数
BOOST_PROGRAM_OPTIONS_DECL std::string to_internal(const std::string& s)
{
return s;
}
当调用上面的函数时,参数“s”的值应该是“这是一个字符串”,但值总是不同的东西。当我说一些不同的东西时,我的意思是一个很长的随机字符串。只要basic_string构造函数抛出异常。
我唯一的猜测是它与函数的调用方式以及参数的传递方式有关,因为该函数是从外部 dll 导入的。
我遵循宏 BOOST_PROGRAM_OPTIONS_DECL 定义,它只是 __declspec(dllimport)
更多信息:
- 标准是 C++14
- 使用的工具集是 Visual Studio 2019 v142
- Boost 库版本为 1.73.0,使用 vcpkg 安装
【问题讨论】:
-
什么/是/价值? “不同的东西”不是一个好的描述。
-
我猜您在其他代码中有 UB(您没有显示),或者您没有运行与您认为正在运行的源代码版本匹配的可执行文件。 coliru.stacked-crooked.com/a/9cbca54709035108
-
@sehe 值是一个随机的长字符串,所以我一开始就知道有问题,basic_string构造函数抛出异常,因为字符串太长。
-
@sehe 我在项目中有其他文件,但我正在评论 main 中的其他所有文件。所以我认为这不是我的代码中的 UB。不匹配的可执行文件的第二个选项更有可能是这种情况。
-
如果在上面的代码中加上
std::cout << res << '\n',会打印什么?垃圾?
标签: c++ boost dllimport stdstring boost-program-options