Я пытаюсь написать программное обеспечение, которое может вести себя по-разному в зависимости от того, должен ли определенный компонент моделироваться в программном обеспечении или выполняться на реальном оборудовании.Однако GCC жалуется, что оператор разрешения области (: :) не может использоваться в макросе, поэтому мой вопрос: возможно ли определить макрос для вызова статического метода?
Моя цель - уметьчтобы, используя другое определение препроцессора, выбрать между использованием всех реальных компонентов (0), использованием всех смоделированных компонентов (1) или использованием комбинации реальных и смоделированных компонентов (2).В этом последнем случае я сталкиваюсь с этой проблемой.В этом случае я хочу вызвать функцию, которую я «защищаю», реализовав ее как статический метод.Вот мой подход:
#define SIM_CONF 2
#if SIM_CONF == 0
#define IS_HW_SIMULATED(name) false
#define IS_HW_REAL(name) true
#endif
#if SIM_CONF == 1
#define IS_HW_SIMULATED(name) true
#define IS_HW_REAL(name) false
#endif
#if SIM_CONF == 2
#define IS_HW_SIMULATED(name) SimConfig::isSimulated(name)
#define IS_HW_REAL(name) SimConfig::isReal(name)
#endif
class SimConfig
{
public:
static bool isSimulated(const char* szName);
static bool isReal(const char* szName);
};
РЕДАКТИРОВАТЬ: Вот пример того, как я использую его в другом месте:
void PumpComponent::commandRevs(float revs)
{
#if IS_HW_SIMULATED("PumpComponent")
// do simulation procedure
#else
// do real hardware procedure
#endif
}
Когда я компилирую, GNU Make жалуется:
error: token "::" is not valid in preprocessor expressions
#define IS_HW_SIMULATED(name) SimConfig::isSimulated(name)
Есть ли какой-нибудь подход, в котором я могу защитить / инкапсулировать функции isSimulated()
и isReal()
и по-прежнему иметь возможность ссылаться на них в директивах препроцессора?