Visual C ++ включает файлы по терминам

Предположим, у меня есть программа в среде VC ++.
Эта программа должна изменить себя, чтобы использовать определенный код для другой операционной системы.

Скажем, например, что программа изменит код, чтобы сделать A за Windows XP и для Windows 7 это изменит код, чтобы сделать B,
Код для акции A находится в файле "a.h" и код для действия B находится в файле "b.h",

Допустим, у меня есть функция, целью которой является обнаружение операционной системы.
Если я хочу загрузить только один из файлов, обнаружив ОС, как я могу включить файл с помощью таких терминов, как активация функции?

1

Решение

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

#include Механизм обрабатывается прекомпилятором, который запускается в момент компиляции, а не во время выполнения, таким образом, как только ваш двоичный файл скомпилирован, все варианты прекомпилятора уже сделаны и попадают в конечный исполняемый файл.

Чтобы сделать что-то другое в зависимости от версии Windows, вы должны включить код для обоих поведений и выбрать правильное поведение во время выполнения, например, используя результаты GetVersionEx API.

3

Другие решения

Вы подразумеваете, что хотите использовать препроцессор для условного построения другого исполняемого файла, а не влиять на поведение во время выполнения. Следствием этого является то, что у вас будет исполняемый файл для каждой операционной системы. Это может или не может быть то, что вы хотите, и приносит с собой свои подводные камни.

Как правило, стоит избегать условной компиляции, если вы не находитесь в ситуации, когда у вас есть код, который просто не будет строить в любой другой среде. Возможно, лучшим решением было бы получить определенную функциональность во время выполнения. Это может быть сделано путем определения ОС или конфигурации и т. Д.

Существуют способы динамической загрузки библиотек, особенно во время выполнения, которые вы можете рассмотреть. Вы можете использовать dlopen Семейство функций в Linux, чтобы сделать это (Не уверен насчет Windows, но я уверен, что есть что-то похожее.) Один недостаток заключается в том, что существует мало способов проверки, поэтому, если вы ошиблись в интерфейсе, с нетерпением ждите ошибок seg. Кроме того, интерфейс ограничен связью C.

2

Правильно, поэтому вполне возможно создать исполняемый файл, который работает на современных и старых версиях 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 в вашем вопросе.

1
По вопросам рекламы [email protected]