я быть_наст ситуации, в C++, где мне нужно:по умолчанию/пользовательские значения для переменных в пространстве имен
1) определяет значение «по умолчанию» для статических переменных константных в пространстве имен объявленного /, определенных в модуле
объекта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"
Включить или 'DefaultValues.h' или' CustomValues.h', но не оба. Вы можете сделать это по-другому, но я бы сказал, что используйте '# define' в' CustomValues.h', а затем проверьте, определено ли это в 'Module.h' и включает в себя' DefaultValues.h' на основе этого. – lapk
@AzzA Я думаю, это не способ сделать это. Константы должны быть скомпилированы и связаны с абсолютным адресом для этого, когда вы определяете класс два раза с разными константами, он должен привести к одному в реальном приложении. – Vyktor
@Vyktor Я думаю, что вопрос заключается в том, как исключить значения по умолчанию, когда заданы специальные значения. Вы можете сделать это с препроцессором ... Или, может быть, я неправильно понял. Я понимаю это, поскольку вы либо выбираете тот или иной, и автору OP нужен способ его выбора. Вы не можете использовать оба, конечно, вы можете включить тот или иной. – lapk