В моем случае это были скобки внутри строки - мне нужно было добавить косую черту перед \ ".
Мой 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
Стандартный способ сделать этот. Возможно, есть возможность отключить определенные макросы, определенные для каждой платформы. Например, _WIN32 будет определен в Windows и почти наверняка не в Linux. Однако я не знаю ни одного соответствующего макроса Linux.
Поскольку вы используете отдельные компиляторы, из этого следует, что у вас есть отдельные среды сборки. Почему бы просто не добавить макрос самостоятельно? И Visual Studio, и GCC поддерживают определение макросов из командной строки, поэтому просто определите их.
Я всегда стараюсь не затрагивать особенности платформы в основном коде, делая это следующим образом
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 для выбора платформы,
Вот что я использую. Он работает в 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