std::string 生成链接器错误—— const char* 不会。为啥?
Posted
技术标签:
【中文标题】std::string 生成链接器错误—— const char* 不会。为啥?【英文标题】:std::string generates linker error -- const char* does not. why?std::string 生成链接器错误—— const char* 不会。为什么? 【发布时间】:2019-01-10 22:55:10 【问题描述】:就像标题所说的那样......我得到了这段代码
std::string dir;
(ls == 1) ? dir = "Long" : dir = "Short";
这会产生我不明白的错误
LNK2019: unresolved external symbol _CrtDbgReportW referenced in function
"void * __cdecl std::_Allocate(unsigned __int64,unsigned __int64,bool)
当我切换到
const char* dir;
(ls == 1) ? dir = "Long" : dir = "Short";
一切都很好。
那里有什么交易?
【问题讨论】:
简单地写std::string dir = (ls == 1) ? "Long" : "Short";
怎么样?
看起来您可能将一些调试库与发布版本混合在一起。
我不是在问如何使代码工作,它确实工作。我在问为什么 std::string 会产生错误而 const char* 不会。即使我把它写在一行上它也不会编译
因为你没有提供编译和链接的命令行,所以报错。
@Nirvikalpa Samadhi:这个问题其实很容易回答:这是因为std::string
在内部使用了CrtDbgReportW
函数而const char*
没有。
【参考方案1】:
在
std::string dir;
(ls == 1) ? dir = "Long" : dir = "Short";
dir
是一个std::string
,这是一个相当复杂的类,它将从标准库中提取零碎,包括似乎调用 Windows 调试辅助函数 _CrtDbgReportW
下的内存分配一些情况。无论出于何种原因,此调试辅助函数都没有被链接。
但是在
const char* dir;
(ls == 1) ? dir = "Long" : dir = "Short";
dir
只是一个简单的指针,一个地址。 dir = "Long"
只是将 dir
指向字符串文字 "long"
。这只是一个简单的任务,不需要任何库的帮助。
【讨论】:
以上是关于std::string 生成链接器错误—— const char* 不会。为啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用 fmt 链接错误:未定义对 `std::string fmt::v6::internal::grouping_impl<char>(fmt::v6::internal::locale
std::map 访问线程是不是安全,如果它的迭代器永远不会失效