Условная компиляция в C++ на основе операционной системы

В моем случае это были скобки внутри строки - мне нужно было добавить косую черту перед \ ".

6
задан M. Dudley 24 May 2009 в 22:23
поделиться

4 ответа

Мой gcc (4.3.3) определяет следующие предопределенные макросы, связанные с Linux:

$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1

В VC ++ (и многих других компиляторах Win32) также есть пара предопределенных макросов, определяющих платформа, в первую очередь _WIN32. Дополнительные сведения: http://msdn.microsoft.com/en-us/library/b0084kay (VS.80) .aspx

7
ответ дан 8 December 2019 в 12:22
поделиться

Стандартный способ сделать этот. Возможно, есть возможность отключить определенные макросы, определенные для каждой платформы. Например, _WIN32 будет определен в Windows и почти наверняка не в Linux. Однако я не знаю ни одного соответствующего макроса Linux.

Поскольку вы используете отдельные компиляторы, из этого следует, что у вас есть отдельные среды сборки. Почему бы просто не добавить макрос самостоятельно? И Visual Studio, и GCC поддерживают определение макросов из командной строки, поэтому просто определите их.

7
ответ дан 8 December 2019 в 12:22
поделиться

Я всегда стараюсь не затрагивать особенности платформы в основном коде, делая это следующим образом

platform.h:

#if BUILD_PLATFORM == WINDOWS_BUILD
#include "windows_platform.h"
#elif BUILD_PLATFORM == LINUX_BUILD
#include "linux_platform.h"
#else
#error UNSUPPORTED PLATFORM
#endif

someclass.c:

void SomeClass::SomeFunction()
{
   system_related_type t;
   // Other code
   platform_SystemCall(&t);
   // Other code
}

Теперь в windows_platform.h и linux_platform.h вы вводите system_related_type в собственный тип и либо #define platform_SystemCall в качестве собственного вызова, либо создаете небольшой функция-оболочка, если набор аргументов от одной платформы к другой слишком различается.

Если системные API-интерфейсы для конкретной задачи сильно различаются между платформами, вам может потребоваться создать собственную версию API, которая разделяет разницу. Но по большей части существует довольно прямое соответствие между различными API в Windows и Linux.

Вместо того, чтобы полагаться на какой-то конкретный компилятор #define для выбора платформы,

5
ответ дан 8 December 2019 в 12:22
поделиться

Вот что я использую. Он работает в Visual Studio 2008 и MinGW:

#ifdef __GNUC__
  #define LINUX
#else
  #define WINDOWS
#endif

#ifdef WINDOWS
  #include "stdafx.h"
#else
  #include <stdlib.h>
  #include <string.h>
  #include <stdio.h>
  #include <ctype.h>
  #include <assert.h>
  #include <malloc.h>
#endif  
0
ответ дан 8 December 2019 в 12:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: