在cpp中修改当前用户的define

时间:2014-10-06 13:18:00

标签: c++ qt visual-c++ boost

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

4 个答案:

答案 0 :(得分:1)

您可以在项目文件中构建SAVED_SETTINGS .pro ):

  1. 以平台依赖方式设置根层次结构
  2. 阅读USERNAME变量(我认为存在于windows和linux上)
  3. 构建定义值并将其添加到预处理器的定义列表中。
  4. 在专业档案中,它看起来像

    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等工具