Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Некоторые компиляторы генерируют #defines, который может помочь Вам с этим. Прочитайте документацию компилятора для определения, каковы они. MSVC определяет тот, который это __WIN32__
, , GCC имеет некоторых, которых Вы видите с touch foo.h; gcc -dM foo.h
Используйте #define OSsymbol
и #ifdef OSsymbol
, где OSsymbol #define
'способный символ, определяющий Вашу целевую ОС.
Обычно Вы включали бы центральный заголовочный файл, определяющий выбранный символ ОС, и использовали бы определенный для ОС, включают и каталоги библиотеки, чтобы скомпилировать и создать.
Вы не определили свою среду разработки, но я вполне уверен, Ваш компилятор обеспечивает глобальный, определяет для общих платформ и Ose.
См. также http://en.wikibooks.org/wiki/C_Programming/Preprocessor
Нет никакого стандартного макроса, который установлен согласно стандарту C. Некоторые компиляторы C установят один на некоторых платформах (например, Apple исправила наборы GCC макрос, чтобы указать, что она компилирует в системе Apple и для платформы Darwin). Ваша платформа и/или Ваш компилятор C могли бы установить что-то также, но нет никакого общего пути.
Как сказанный hayalci, лучше иметь их набор макросов в Вашем процессе сборки так или иначе. Легко определить макрос с большинством компиляторов, не изменяя код. Можно просто передать -D MACRO
GCC, т.е.
gcc -D Windows
gcc -D UNIX
И в коде:
#if defined(Windows)
// do some cool Windows stuff
#elif defined(UNIX)
// do some cool Unix stuff
#else
# error Unsupported operating system
#endif
https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros
я думаю, что Вы ищете:
_WIN32 - Определенный как 1, когда цель компиляции является 32-разрядным ARM, 64-разрядным ARM, x86, или x64. Иначе, неопределенный
_WIN64 - Определенный как 1, когда цель компиляции является 64-разрядным ARM или x64. Иначе, неопределенный.
я думаю, что Вы ищете:
__ GNUC __
__ GNUC_MINOR __
__ GNUC_PATCHLEVEL __
Делают Google для Ваших соответствующих предопределенных компиляторов.
В большинстве случаев лучше проверить, присутствует ли данная функциональность или нет. Например: если функция pipe()
существует или нет.
покажите, что GCC определяет в Windows:
gcc -dM -E - <NUL:
на Linux:
gcc -dM -E - </dev/null
Предопределенные макросы в MinGW:
WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386
на UNIXes:
unix __unix__ __unix