Предположим, у меня есть программа в среде VC ++.
Эта программа должна изменить себя, чтобы использовать определенный код для другой операционной системы.
Скажем, например, что программа изменит код, чтобы сделать A
за Windows XP
и для Windows 7
это изменит код, чтобы сделать B
,
Код для акции A
находится в файле "a.h"
и код для действия B
находится в файле "b.h"
,
Допустим, у меня есть функция, целью которой является обнаружение операционной системы.
Если я хочу загрузить только один из файлов, обнаружив ОС, как я могу включить файл с помощью таких терминов, как активация функции?
Вы не можете сделать такую вещь, как вы выставили это.
#include
Механизм обрабатывается прекомпилятором, который запускается в момент компиляции, а не во время выполнения, таким образом, как только ваш двоичный файл скомпилирован, все варианты прекомпилятора уже сделаны и попадают в конечный исполняемый файл.
Чтобы сделать что-то другое в зависимости от версии Windows, вы должны включить код для обоих поведений и выбрать правильное поведение во время выполнения, например, используя результаты GetVersionEx
API.
Вы подразумеваете, что хотите использовать препроцессор для условного построения другого исполняемого файла, а не влиять на поведение во время выполнения. Следствием этого является то, что у вас будет исполняемый файл для каждой операционной системы. Это может или не может быть то, что вы хотите, и приносит с собой свои подводные камни.
Как правило, стоит избегать условной компиляции, если вы не находитесь в ситуации, когда у вас есть код, который просто не будет строить в любой другой среде. Возможно, лучшим решением было бы получить определенную функциональность во время выполнения. Это может быть сделано путем определения ОС или конфигурации и т. Д.
Существуют способы динамической загрузки библиотек, особенно во время выполнения, которые вы можете рассмотреть. Вы можете использовать dlopen
Семейство функций в Linux, чтобы сделать это (Не уверен насчет Windows, но я уверен, что есть что-то похожее.) Один недостаток заключается в том, что существует мало способов проверки, поэтому, если вы ошиблись в интерфейсе, с нетерпением ждите ошибок seg. Кроме того, интерфейс ограничен связью C.
Правильно, поэтому вполне возможно создать исполняемый файл, который работает на современных и старых версиях Windows. Типичный способ сделать это — проверить актуальную версию, а затем изменить код. MS рассказывает, как проверить версию здесь:
http://msdn.microsoft.com/en-gb/library/windows/desktop/ms724429(v=vs.85).aspx
Тогда вы просто делаете флаг, скажем bool isWndowsXP
это устанавливается проверочным кодом, и, где это уместно, делать if(isWindowsXP) do_stuff_xp_way(); else do_stuff_otherway();
Если вам нужен более конкретный совет, вам действительно нужно предоставить функциональность, которая скрыта за A и B в вашем вопросе.