2014-01-07 3 views
3

Я довольно новый с C++, и у меня есть файл, который мне нужно собрать как в Linux, так и в Windows.Как иметь разные заголовки на разных платформах?

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

Как:

if_Windows 
    #include <Include1> 
if_Linux 
    #include <Include2> 

Можно ли сделать что-то вроде этого? Как ты делаешь это?

+0

Иногда стоит рассмотреть возможность тестирования других макросов, чем платформа. Это может привести к менее сложному коду. – user2672165

+1

@closevoters: этот вопрос ** НЕ ** дубликат «как обнаружить систему». обнаружение системы (аналогично обнюхиванию браузера в веб-разработке) является лишь одним из способов решения этой проблемы. и это imho абсолютно не обязательно лучший способ, хотя это очень распространенная практика - точно так же, как обнюхивание браузером было и, возможно, все еще является обычной практикой. –

ответ

2

Вы могли бы определить макрос, который вы установили при компиляции для окон и Linux ,

#define MYPROJECT_CONFIG_WINDOWS_PLATFORM 

#if defined(MYPROJECT_CONFIG_WINDOWS_PLATFORM) 
    #include <include1> 
#elif defined(MYPROJECT_CONFIG_LINUX_PLATFORM) 
    #include <include2> 
#else 
    #error link: no suitable library 
#endif 

Все, что вам тогда нужно сделать, это определить MYPROJECT_CONFIG_WINDOWS_PLATFORM при компиляции для окон и MYPROJECT_CONFIG_LINUX_PLATFORM при компиляции для Linux.

Некоторые IDE также имеют предустановленные макросы для платформы, которую они компилируют для (например, WIN32 для Windows), но вам нужно будет проверить документацию для них.

+2

Примечание: Идентификаторы формы '\ w * __ \ w *' и '_ [A-Z] \ w *' ** зарезервированы для реализации **. Выберите другие идентификаторы, кроме '__Window__' или' __Linux__', или вы находитесь в мире боли. –

+0

@ MatthieuM. Изменено – Caesar

+0

Я предпочитаю не использовать макросы, зависящие от IDE, так как я не знаю, кто будет работать над моим проектом в будущем, и я хочу сделать его как litle IDE/tools зависимым, насколько это возможно. – Dzyann

0

Вам необходимо использовать предварительный процессор.

См http://www.cplusplus.com/doc/tutorial/preprocessor/

Переменные вещи определяются и с помощью #ifdef и т.д. Вы можете просто включить правильный материал для конкретной платформы

2

Вам необходимо использовать #ifdef в сочетании с подходящим макросом для вас. Например,

#ifdef WIN32 
// Windows includes 
#elseif __unix__ 
// Unix included 
#endif 

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

+0

Стандартный макрос де-факто имеет подчеркивание спереди, то есть '_WIN32', а не' WIN32', как написано в этом ответе. –

2

Используйте директиву препроцессора #if:

#if defined(WIN32) 
#include <foo_w.h> 
#else 
#include <foo_l.h> 
#endif 

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

0

Моего предпочтительный способ заключается в

#include <myheader.h> 

и использовать компилятор включает путь включать заголовки из разных папок на другой системе.


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

#ifdef _WIN32 
# include <myheader.windows.h> 
#else 
# include <myheader.nix.h> 
#endif 

где _WIN32 определяется компилятором в 32-х и 64-битных платформ Windows (обратите внимание, что это не officfial стандарт, только де факто стандарт).


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

+0

С помощью вашего первого метода вы предполагаете, что имена файлов будут одинаковыми для обеих платформ. Много времени это не так. – Caesar

+0

@MohammedMajeed: нет, нет * предположение *, что имена файлов одинаковы. вы отвечаете за имя файла: вы его выбираете. эти системные заголовки могут в свою очередь включать все, что вы хотите. никогда не бывает так, что вы не можете этого сделать. –

+0

Так вы предлагаете иметь файл «myheader.h», где у меня есть фактические файлы, и у меня есть два разных файла для Linux и один для Windows? Или вы просто говорите, что все зависимости имеют одно и то же имя для Linux и Windows, но с разными реализациями и в зависимости от того, какую папку я скажу компилятору для поиска, он будет строить соответственно? – Dzyann

Смежные вопросы