моя проблема в том, что я хотел бы организовать свой код, чтобы я мог иметь отлаживать а также релиз версия одних и тех же методов, и я могу иметь несколько определений одних и тех же методов для разных целевых платформ.
По сути, суть проблемы одинакова для обоих, мне нужно иметь одинаковую подпись, но с разными определениями.
Каков наилучший способ организовать мой код в файловой системе и для компиляции и производства, чтобы я мог сохранить это в чистоте и отделить?
Благодарю.
Я предлагаю вам вмешаться на исходном уровне, а не в заголовочных файлах (просто чтобы сохранить те же интерфейсы), что-то вроде:
//Foo.h
class Foo{
void methodA();
void methodB();
};//Foo.cpp
// common method
Foo::methodA() { }
#ifdef _DEBUG_
Foo::methodB() { }
#elif _PLATFORM_BAR_
Foo::methodB() { }
#else
Foo:methodB() { }
#endif
Если вместо этого вы хотите, чтобы все было разделено, вам придется работать на более высоком рычаге, препроцессора недостаточно для условного включения файла .cpp вместо другого. Вам придется работать с Makefile или что вы используете.
Другим вариантом может быть выбор исходных файлов, которые просто исчезают, когда не на конкретной платформе, например:
//Foo.h
class Foo{
void methodA();
void methodB();
};
//FooCommon.cpp
void Foo::methodA() { }
//FooDebug.cpp
#ifdef _DEBUG_H
void Foo::methodB() { }
#endif
//FooRelease.cpp
#ifndef _DEBUG_H_
void Foo::methodB() { }
#endif
// #define DEBUG - we're making a non debug version#ifdef DEBUG
// function definition for debug
#else
// function definition for release
#endif
То же самое можно сделать для разных операционных систем. Конечно, существует проблема перекомпиляции всего этого, что может быть проблемой в C ++.
Если ваш компилятор позволяет, вы можете попытаться сохранить исходные файлы для каждой версии в отдельной подпапке (например, #include "x86_d/test.h"
) затем с помощью глобальных макроопределений для управления потоком:
#define MODE_DEBUG
#ifdef MODE_DEBUG
#include "x86dbg/test.h"#else
#include "x86rel/test.h"#endif
Вы также можете использовать аналогичную структуру для определений функций-членов, так что вы можете иметь два разных определения в одном файле. Многие компиляторы также используют свои собственные определения для глобальных макросов, поэтому вместо #define MODE_DEBUG
выше, вы можете использовать что-то вроде #ifdef _CPP_RELEASE
или, может быть, даже определить один через флаг компилятора.