设置全局指针

时间:2017-11-24 13:14:43

标签: c++ visual-studio

我正在使用具有一些日志记录的外部库,您可以更改日志目录,

external_library.hpp

extern char const* _log;

external_library.cpp

char const* _log = "path_to_log.log";

在我自己的项目中,我有:

settings.cpp

#include "external_library.hpp"
void set_log_path() {
 std::string _p = "new_path_log.log";
 char const* _log = _p.c_str();
}

我希望只是改变日志路径,我所拥有的不起作用,但它也没有给出任何错误,如果我这样做:

#include "external_library.hpp"
void set_log_path() {
 std::string _p = "new_path_log.log";
 _log = _p.c_str();
}

我得到_log is undefined或:

#include "external_library.hpp"
char const* _log;
void set_log_path() {
 std::string _p = "new_path_log.log";
 _log = _p.c_str();
}

给了我:

1>external_library.lib(assert.obj) : error LNK2005: "char const * const _log" (?external_library_assert_log@@3PEBDEB) already defined in _functions.obj

我是怎么做到的?

1 个答案:

答案 0 :(得分:4)

您的方法存在的问题是,只要_p.c_str()退出,set_log_path返回的值就会失效。这是因为C字符串归std::string所有,会被销毁。

由于标题文件external_library使用_log关键字声明extern,这应该有效:

#include "external_library.hpp"
void set_log_path() {
   _log = "new_path_log.log";
}

如果需要动态构造日志路径,请创建一个合适大小的静态char[]缓冲区,格式化其中的路径,并将_log设置为指向该缓冲区。

或者,您可以在函数中设置std::string _p static,以避免在退出函数时调用析构函数。