Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
绕过c&x2B+;以空结尾的字符串 我使用Booo::程序选项,它和许多其他C++ LIBS一样,甚至STD本身:它仍然使用C风格的空结尾字符串,因为没有人真正喜欢弱小的代码> STD::String .P/>_C++_String - Fatal编程技术网

绕过c&x2B+;以空结尾的字符串 我使用Booo::程序选项,它和许多其他C++ LIBS一样,甚至STD本身:它仍然使用C风格的空结尾字符串,因为没有人真正喜欢弱小的代码> STD::String .P/>

绕过c&x2B+;以空结尾的字符串 我使用Booo::程序选项,它和许多其他C++ LIBS一样,甚至STD本身:它仍然使用C风格的空结尾字符串,因为没有人真正喜欢弱小的代码> STD::String .P/>,c++,string,C++,String,所讨论的方法是: options_description_easy_init& operator()(const char* name, const value_semantic* s, const char* description); 典型的用例很好: options.add_options() ("graphical", bool_switch(&isGraphical)->default_value(false)

所讨论的方法是:

options_description_easy_init&
operator()(const char* name,
           const value_semantic* s,
           const char* description);
典型的用例很好:

options.add_options()
    ("graphical", bool_switch(&isGraphical)->default_value(false),
     "Show any graphical output during runtime")
但是,我需要动态设置选项的名称。原因是在某些情况下,我需要一个自定义前缀,该前缀由我的函数
std::string key(const std::string&k)
添加到字符串中:

这是失败的

我现在可以在std::string上使用c_str(),但这很糟糕——我不知道program_选项将变量保留多久,以及我的字符串在需要时是否仍然有效

我还可以在缓冲区中保留内存等,然后交上去。缓冲区永远不会被释放,它很糟糕


在这种情况下,我还能做些什么来避免C风格的字符串混乱吗?

在这样的函数调用的生命周期之外,不保留const char*是一种很强的惯例。只要他们不违反这一惯例,
.c_str()
就是你想要做的事情的最佳方式

options.add_options()
    (key("graphical").c_str(), bool_switch(&isGraphical)->default_value(false),
     "Show any graphical output during runtime")

在这样一个函数调用的生命周期之外,不保留const char*是一个非常强大的惯例。只要他们不违反这一惯例,
.c_str()
就是你想要做的事情的最佳方式

options.add_options()
    (key("graphical").c_str(), bool_switch(&isGraphical)->default_value(false),
     "Show any graphical output during runtime")

我同意威尔的观点,即参数不太可能在函数调用之外被引用。但是,如果您确实认为这是一个问题,那么可以使用静态字符串或字符数组来存储key()的输出,并将其传递到操作符()。不过,这可能与单个内存泄漏相同,具体取决于您的观点。

我同意威尔的观点,即不太可能在函数调用之外引用参数。但是,如果您确实认为这是一个问题,那么可以使用静态字符串或字符数组来存储key()的输出,并将其传递到操作符()。不过,这可能与单个内存泄漏相同,具体取决于您的观点。

嗯,一个更优雅的解决方案还没有出现,对吗?我的意思是我希望key首先返回const char*,但是字符串对象肯定会过早消亡。@ypnos:
std::string
不一定会解决生存期问题-如果接口使用
std::string
指针或引用,您仍然会有一个问题,即怀疑函数是否复制了副本,或者是否需要保持传入的内容处于活动状态。当然,如果函数采用
std::string
值,那么您就不必在意了。我想知道他们不为此提供重载是否有原因?如果函数采用const std::string&作为参数,我假设它将生成一个真正的副本,或者只在函数返回之前使用它。但这种假设可能是错误的;)@ypnos:听起来你对这里的问题有很好的理解。所以你的问题可以改为:“我遗漏了什么吗?”答案是“没有,你没有遗漏任何东西。”:-)一般来说,如果C++函数接受指针或引用,编译器就不能保证调用后调用方不会持有该指针或引用。您只剩下约定、文档、实现检查,或者作为最后手段故意泄漏一些内存。通常前两个就足够了。:)祝你好运嗯,一个更优雅的解决方案还没有出现,对吧?我的意思是我希望key首先返回const char*,但是字符串对象肯定会过早消亡。@ypnos:
std::string
不一定会解决生存期问题-如果接口使用
std::string
指针或引用,您仍然会有一个问题,即怀疑函数是否复制了副本,或者是否需要保持传入的内容处于活动状态。当然,如果函数采用
std::string
值,那么您就不必在意了。我想知道他们不为此提供重载是否有原因?如果函数采用const std::string&作为参数,我假设它将生成一个真正的副本,或者只在函数返回之前使用它。但这种假设可能是错误的;)@ypnos:听起来你对这里的问题有很好的理解。所以你的问题可以改为:“我遗漏了什么吗?”答案是“没有,你没有遗漏任何东西。”:-)一般来说,如果C++函数接受指针或引用,编译器就不能保证调用后调用方不会持有该指针或引用。您只剩下约定、文档、实现检查,或者作为最后手段故意泄漏一些内存。通常前两个就足够了。:)祝你好运文档中关于AddiPopOpths:()如何保存传入的指针?原始数组不是“邪恶的”,如果你需要一个数组,那么使用它。文档中关于AddiPopOpths:()保存传入的指针的内容是什么?原始数组不是“邪恶的”,如果需要,就使用它。