我有一个旧的C ++代码库,它有一些#define,必须为当前用户修改。
以最少的更改编辑这些代码的最佳方法是什么。
// old code
#define SAVED_SETTINGS /usr/test/backup
// some what like
#define SAVED_SETTING /usr/{username}/backup
同样也会在windows
中// old code
#define SAVED_SETTINGS c:/helloworld/test/backup
// some what like
#define SAVED_SETTING c:/helloworld/{username}/backup
答案 0 :(得分:1)
您可以在项目文件中构建SAVED_SETTINGS
( .pro ):
USERNAME
变量(我认为存在于windows和linux上)在专业档案中,它看起来像
win32{
SAVED_SETTING_PREFIXDIR = "c:/helloworld"
}
else{
unix{
SAVED_SETTING_PREFIXDIR = "/usr"
}
else{
SAVED_SETTING_PREFIXDIR = ""
}
}
SAVED_SETTING_VALUE = "$${SAVED_SETTING_PREFIXDIR}/$$(USERNAME)/backup"
DEFINES += "SAVED_SETTING=$${SAVED_SETTING_VALUE}"
答案 1 :(得分:1)
要求:由于对返回字符串的一些限制,此代码解决了问题,并且只能在NOT多线程环境中使用。
自定义以下功能以提供用户名
const char* yourFunctionToObtainUserName() {
//your code
return "myUser";
}
将此代码放在.h文件中,您已在其中定义了SAVED_SETTINGS宏
//simply change the pre and post string to adapt it to windows...
#define SAVED_SETTINGS ((const char*)SavePath("/usr/","/backup"))
class SavePath {
private:
//I assume you don't have more than 1024 chars in you path
static char s_szReturnedPath[1024];
public:
SavePath( const char* szPre, const char* szPost);
inline operator const char*() { return s_szReturnedPath; }
inline operator char*(){ return s_szReturnedPath; }
};
将以下代码放入正确的.cpp文件
char SavePath::s_szReturnedPath[1024];
SavePath::SavePath( const char* szPre, const char* szPost)
{
strcpy( s_szReturnedPath, szPre);
strcat( s_szReturnedPath, yourFunctionToObtainUserName() );
strcat( s_szReturnedPath, szPost);
}
通过这种方式,您无需修改旧代码中的文件。
答案 2 :(得分:0)
将SAVED_SETTING重写为行为类似于const char *的类型的实例。
这样的事情:
(您可能需要添加一些运算符以使其与std :: ostream等完美匹配)
namespace detail {
struct _saved_setting {
_saved_setting() {
static const char noone[] = "test";
const char* p = getenv("USER");
if (!p) p = noone;
std::ostringstream ss;
ss << "c:/helloworld/" << p << "/backup";
_buffer = ss.str();
}
const char* operator() const {
return _buffer.str();
}
std::string _buffer;
};
}
namespace {
detail::_saved_setting SAVED_SETTING;
}
答案 3 :(得分:0)
根据我的经验,最好使用&#39;配置&#39;进入你的构建系统。 我们这样做:用一些适当的后缀重命名文件,例如:
defs.h - &gt; defs.h.in
为占位符[{1}}使用正确的(不同的)标记对C不是很好 - {username}
或{{username}}
设置构建系统,以便在创建没有%%username%%
扩展名的文件时用占位符代替实际值。然后像往常一样使用生成的.in
标头。
详细信息取决于所使用的构建系统,但autoconf和cmake直接支持,而使用custon系统,您可以使用m4或sed等工具