修改cpp中当前用户的定义
Modifying define for current user in cpp
我有一个旧的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
要求:由于对返回字符串的一些限制,此代码解决了问题,并且只能在NOT多线程环境中使用。
自定义以下功能以提供用户名
const char* yourFunctionToObtainUserName() {
//your code
return "myUser";
}
将此代码放在定义SAVED_SETTINGS宏的.h文件中
//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);
}
这样就不需要修改旧代码中的文件。
您可以在项目文件中构建SAVED_SETTINGS
(.pro):
- 以依赖于平台的方式设置根层次结构
- 读取
USERNAME
变量(我认为存在于windows和linux上) - 构建define值并将其添加到预处理器的defines列表中
在专业文件中,它看起来像
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}"
将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;
}
根据我的经验,最好在构建系统中使用"配置"步骤。我们这样做:用适当的后缀重命名文件,例如:
中的defs.h-->defs.h
为占位符{username}
使用适当的(不同的)标记对C来说不是很好——{{username}}
或%%username%%
怎么样
在创建不带.in
扩展名的文件时,设置构建系统以用占位符替换实际值。然后像往常一样使用生成的defs.h
标头。
详细信息取决于所使用的构建系统,但autoconf和cmake直接支持这一点,对于custon系统,您可以使用m4或sed 等工具
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- Visual C++(VS2017)中用户定义的转换不明确
- 使用用户定义的参数调用future/async并调用类方法
- 带有用户定义类的c++折叠表达式
- g++用户定义的动态链接库上的全局new和delete运算符
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 修改"std::set"中用户定义类型的值
- 参数包构造函数在类模板中隐藏用户定义的转换
- MAKE:找不到包含的用户定义的头文件?
- C++:用户定义的显式类型转换函数错误
- 从用户定义的类生成格式字符串?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- C++ 向量与用户定义的类比较?(==, <, >)
- STL 用户定义的二进制操作
- 将用户定义的类型与 std::vector 和 std::sort 一起使用
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 使用宏编译时使用用户定义的数学函数,或者仅使用 c++ 中标准数学库中的函数
- C++:用户定义的类,以成员字段作为地址