修改cpp中当前用户的定义

Modifying define for current user in cpp

本文关键字:用户 定义 cpp 修改      更新时间:2023-10-16

我有一个旧的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):

  1. 以依赖于平台的方式设置根层次结构
  2. 读取USERNAME变量(我认为存在于windows和linux上)
  3. 构建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 等工具