Как я проверяю ОС с директивой препроцессору?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
173
задан phuclv 26 October 2018 в 02:33
поделиться

6 ответов

Некоторые компиляторы генерируют #defines, который может помочь Вам с этим. Прочитайте документацию компилятора для определения, каковы они. MSVC определяет тот, который это __WIN32__, , GCC имеет некоторых, которых Вы видите с touch foo.h; gcc -dM foo.h

1
ответ дан MD XF 23 November 2019 в 20:36
поделиться

Используйте #define OSsymbol и #ifdef OSsymbol, где OSsymbol #define 'способный символ, определяющий Вашу целевую ОС.

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

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

См. также http://en.wikibooks.org/wiki/C_Programming/Preprocessor

2
ответ дан MD XF 23 November 2019 в 20:36
поделиться

Нет никакого стандартного макроса, который установлен согласно стандарту 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
3
ответ дан Mecki 23 November 2019 в 20:36
поделиться

Microsoft C/C ++ компилятор (MSVC) Предопределенные Макросы может быть найден здесь:

https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros

я думаю, что Вы ищете:

_WIN32 - Определенный как 1, когда цель компиляции является 32-разрядным ARM, 64-разрядным ARM, x86, или x64. Иначе, неопределенный
_WIN64 - Определенный как 1, когда цель компиляции является 64-разрядным ARM или x64. Иначе, неопределенный.

gcc компилятор Макросы PreDefined могут быть найдены здесь:

http://gcc.gnu.org/onlinedocs/cpp/Predefined-Macros.html

я думаю, что Вы ищете:

__ GNUC __
__ GNUC_MINOR __
__ GNUC_PATCHLEVEL __

Делают Google для Ваших соответствующих предопределенных компиляторов.

5
ответ дан MartyMacGyver 23 November 2019 в 20:36
поделиться

В большинстве случаев лучше проверить, присутствует ли данная функциональность или нет. Например: если функция pipe() существует или нет.

10
ответ дан MD XF 23 November 2019 в 20:36
поделиться

покажите, что 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
66
ответ дан MD XF 23 November 2019 в 20:36
поделиться
Другие вопросы по тегам:

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