我需要一个编译时项目配置文件来配置几个c ++项目。 我的设置如下:
我需要一个简单的解决方案来配置这三个。 我需要资源使用率低,因为我受内存限制(部署在Arduino上)。
我的第一个解决方案是每个项目中的configuration.h文件,其中包含相应项目的#define。
这种方法有问题:我无法从proj1 / proj2为lib1定义不同的值。比方说,lib1定义了UDP_PORT,然后我不能在proj1 / proj2中指定不同的UDP_PORT,而lib1实际上会使用它。
当然,我可以在运行时将所有这些配置值作为参数传递。为了节省内存和运行时间,我宁愿选择编译时解决方案。
答案 0 :(得分:0)
您可以添加一个类 ConfigurationParameterVault ,其界面适合提供您需要的所有参数。将.h文件放在所有项目都可以访问它的地方(可能在lib的项目中?)
COMMON.H
class ConfigurationParameterVault{
ConfigurationParameterVault();
~ConfigurationParameterVault();
public:
int getUDPPort();
int getOtherParameter();
...
void* m_pImpl;
}
现在为每个项目添加一个.cpp文件(其中也实现了保管库)。因此,在构建时,liker从正在构建的项目中的.cpp文件中选择实现!
保险库的实现遵循PIMPL习惯用法。因此,如果头文件很常见,每个实现都可以在保险库中存储一些状态。
在第一个项目中:Vault.cpp
class Project1VaultImpl{
Project1VaultImpl() :
udpPort(53124),
otherParam(28){
};
int udpPort;
int otherParam;
}
ConfigurationParameterVault::ConfigurationParameterVault() :
m_pImpl(new Project1VaultImpl()){
}
ConfigurationParameterVault::ConfigurationParameterVault() :
delete m_pImpl;
}
int ConfigurationParameterVault::getUDPPort(){
Project1VaultImpl* pImpl = reinterpret_cast<Project1VaultImpl*>(m_pImpl);
return pImpl->udpPort;
}
如果所有项目都需要共享一些公共参数,则所有Pimpl可以扩展相同的基类。如果一个项目需要使用与普通项不同的值,则其特定的Vault实现可以覆盖它
答案 1 :(得分:0)
你没有提到你的Arduino构建系统是托管在Windows,Linux还是“其他东西”上。
无论哪种:您应该能够轻松地使用“make”自动构建一个或多个项目:
http://www.arduino.cc/playground/Learning/CommandLine
https://github.com/queezythegreat/arduino-cmake
如果您不熟悉“make”,网上有很多很好的教程,包括:
http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/
答案 2 :(得分:0)
你可以做几件事:
gcc -DUDP_PORT = 1234 myProject.cpp
gcc -DUDP_PORT = 1234 myLib.cpp
在运行时将硬编码的UDP端口从项目传递到lib。这实际上不会影响您的开销。
// in project_1
lib::set_udp_port(UDP_PORT);
// in the lib
static short g_udp_port;
lib::set_udp_port(short port)
{
g_udp_port = port;
}
数字2,但在运行程序时通过命令行传入端口
my_program --port 1234