我正在使用具有一些日志记录的外部库,您可以更改日志目录,
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
我是怎么做到的?
答案 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,以避免在退出函数时调用析构函数。