У меня есть ситуация в C ++, где мне нужно:
1) определить значение "по умолчанию" для статических переменных const в пространстве имен, объявленном / определенном в объектном модуле
2)разрешить нескольким «основным» программам «перезаписывать» эти значения, используя «пользовательские» значения
каждая «основная» программа имеет свою собственную папку сборки и собственную копию объектного модуля, поэтому «основные» программы полностью независимыдруг от друга:
например,
/mainProgramA/build/mainProgramA.o
/mainProgramA/build/Module.o
/mainProgramB/build/mainProgramB.o
/mainProgramB/build/Module.o
также, в любое время будут определены / объявлены либо значения по умолчанию, либо пользовательские значения, но не оба.если компилятор «находит» пользовательские значения, они будут использоваться, если нет, будут использоваться значения по умолчанию.
Я не могу использовать слабые символы без пространств имен, потому что мне нужны пространства имен, чтобы избежать конфликтов имен.я не могу использовать слабые символы с пространствами имен, потому что я получаю «ошибка: слабое объявление ... должно быть открытым».я мог бы использовать класс, возможно, но все значения известны во время компиляции и не переменные.Какой самый простой и элегантный способ сделать это?
, чтобы уточнить, я пытаюсь сделать что-то вроде этого:
DefaultValues.h:
namespace ConfigParams {
static const int param1 = 1;
static const int param2 = 2;
}
CustomValues.h:
namespace ConfigParams {
static const int param1 = 100;
static const int param2 = 200;
}
Module.h:
#include "DefaultValues.h"
class Module {
public:
static void printParam1();
}
Module.cpp:
#include "Module.h"
void Module::printParam1()
{
printf("%d\n", param1);
}
mainUsingDefaultValues.cpp (который будет ссылаться на копиюmodule.o где param1 == 1):
#include "Module.h"
...
Module::printParam1(); // Should print "1"
mainUsingCustomValues.cpp (который будет ссылаться на копию module.o, где param1 == 100):
#include "CustomValues.h"
#include "Module.h"
...
Module::printParam1(); // Should print "100"