C ++ условная компиляция с большим количеством файлов кода

Я хочу скомпилировать и запустить одну копию кодов C ++ на Windoes и Linux. поэтому мне нужно использовать условную компиляцию (CC). однако, сталкивается с проблемой как использовать CC в большом количестве файлов кода.

например, у меня есть:

//A.cpp
#define _WINDOWS_
#ifdef _WINDOWS_
#include <windows.h>
//some code for windows
#else
#include <pthread.h>
//some code for linux
#endif

и у меня также есть B.cpp, C.cpp …

Должен ли я написать «#define _WINDOWS_» в каждом отдельном файле, или у него есть лучший способ?

И я попытался сделать так:
1. создать головной файл Platform.h

#ifndef _PLAT_
#define _PLAT_
#define _WINDOWS_
#endif

2. включите файл Platform.h, например:

//A.cpp
#include "Platform.h"#ifdef _WINDOWS_
#include <windows.h>
//some code for windows
#else
#include <pthread.h>
//some code for linux
#endif

3. он компилирует ошибку! Может быть, в том числе «Platform.h», прежде чем вызвать ошибку.

Благодарю.

1

Решение

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

http://sourceforge.net/p/predef/wiki/OperatingSystems/

#ifdef _WIN32
// Code specific to Windows.
#elif defined __linux__ // Many variants; check the link above.
// Code specific to Linux.
#else
// Portable code.
#endif

Это будет работать в большинстве случаев.

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

Если все остальное терпит неудачу (например, целевая система отличается от хоста, или ваш компилятор достаточно странный, чтобы вообще не предопределять какие-либо макросы обнаружения системы), просто определите любой из них в командной строке компилятора (например, используя -D в POSIX-совместимых компиляторах C), поместив его в свой скрипт сборки или make-файл. Не пиши такое #defineсами в шапке.

2

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

Вы можете использовать -D_WINDOWS_ во время компиляции. Для (3) обратите внимание, что заголовки чувствительны к порядку.

0