значения по умолчанию / пользовательские значения для переменных в пространстве имен - PullRequest
1 голос
/ 16 января 2012

У меня есть ситуация в 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"

1 Ответ

2 голосов
/ 16 января 2012
// File: CustomValues.h
#define MY_CUSTOM_VALUES
namespace ConfigParams 
{
 static const int param1 = 100;
 static const int param2 = 200;
}


// File: DefaultValues.h
#ifndef MY_CUSTOM_VALUES
namespace ConfigParams 
{
 static const int param1 = 1;
 static const int param2 = 2;
}
#endif

Вы можете сделать его более гибким, если вам это нужно.

РЕДАКТИРОВАТЬ: На всякий случай я неправильно понял вопрос. Таким образом, по умолчанию для пользователя вашей библиотеки будет установлено значение DefaultValues.h, если только оно не включает CustomValues.h до Module.h. Вы можете иметь и то, и другое, но не оба.

#include "Module.h"
#include "CustomValues.h"

не будет компилироваться, так как вы будете переопределять свои константы.

И просто для уверенности, вам нужно будет также включить CustomValues.h в Module.cpp. Так что, вероятно, лучше сделать #ifdef переключатель внутри Module.h и заставить пользователя #define MY_CUSTOM_VALUES где-нибудь до того, как Module.h включает:

// File: Module.h
#include "My_Constants.h" // #define MY_CUSTOM_VALUES can go here
#ifdef MY_CUSTOM_VALUES
#include "CustomValues.h"
#elif
#include "DefaultValues.h"
#endif

class Module
{
 public:
  static void printParam1();
}   
// End of Module.h

// File: Module.cpp
#include "Module.h"

void Module::printParam1() 
{
 printf("%d\n", ConfigParams::param1);
}
// End of Module.cpp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...