在C++中使用常量变量

本文关键字:常量 变量 C++ | 更新日期: 2023-09-27 18:27:50

我在Visual Studio中的C++项目中有一个C++文件。C++文件有一个片段,其中一些应用程序使用system 运行

system("Files''tx1");
system("Files''tx2");
system("Files''tx3");
system("Files''tx4");

我想用一些可以在一个地方更改的常量变量来替换"Files"常量。类似于我们在C#中使用app.config文件等所做的操作。
直接对常数进行硬编码不是一个好的做法。与C#项目不同,C++项目没有设置文件。那么,在这种情况下我应该怎么做,有什么建议吗?

在C++中使用常量变量

如果您想使用编译时方法(就像C#中的app.config一样),可以使用defines。

conf.h

#define FILES "mypath"

impl.c

#include "conf.h"
...
system(FILES "tx1");

当您喜欢运行时方法时,配置文件有许多格式/库。

由于没有类似于app.config文件的机制,您将不得不自行旋转。有很多框架可以做到这一点。

一种选择是使用boost属性树库。这允许将配置数据轻松串行化为各种文件格式。

但是,您仍然需要创建一个全局对象来访问这些值。

您可以简单地编写自己的小型设置解析器,这并不难,或者使用一些预制库来读取某种配置文件(例如,您可以使用Windows API来读取/写入ini文件,也可以使用某种json/xml库)。

我个人更喜欢用pugixml来做这样的事情。

我会为自己创建一个这样的类:

class Path
{
private:
    static const std::string prefix_;
public:
    static std::string get(const std::string& file)
    {
        return prefix_ + '''' + file;
    };
}; // eo class Path

.cpp

const std::string Path::prefix_ = "Files";

现在,它很容易在其他地方使用:

system(Path::get("tx1").c_str());
system(Path::get("tx2").c_str());
system(Path::get("tx3").c_str());
system(Path::get("tx4").c_str());

放置一个内联函数来代替常量,该函数在给定最低要求的数据的情况下返回适当的值:例如

inline const char *FileNum(int n) {
 static char buf[100];
 sprintf(buf, "Files''txt%d", n);
 return buf;
}

并呼叫

system(FileNum(1));
...