Какой кроссплатформенный препроцессор определяет? (__WIN32__ или __WIN32 или WIN32)?

Оператор сложения работает следующим образом: 1) Если хотя бы один операнд является строкой, другой преобразуется в строку и выполняется конкатенация

1 + "2"        // "12"
"2" + "3"      // "23"
"2" + null     // "2null", null is converted to "null"

2) В других случаях оба операнда преобразуются в числа:

1 + null      // 2, null is converted to 0
1 + undefined // NaN, undefined is converted to NaN

Для получения дополнительной информации см. сообщение оператора сложения JavaScript для демистификации .

38
задан Brian Tompsett - 汤莱恩 14 June 2016 в 10:43
поделиться

4 ответа

Это зависит от того, что вы пытаетесь сделать. Вы можете проверить компилятор, если ваша программа хочет использовать некоторые определенные функции (например, из набора инструментов gcc). Вы можете проверить операционную систему (_WINDOWS, __unix__), если хотите использовать некоторые функции, специфичные для ОС (независимо от компилятора - например, CreateProcess в Windows и fork в unix).

Макросы для Visual C

Макросы для gcc

Вы должны проверить документацию каждого компилятора, чтобы иметь возможность обнаруживать различия при компиляции. Я помню, что набор инструментов gnu (gcc) имеет некоторые функции в библиотеке C ( libc ), которых нет в других наборах инструментов (например, Visual C). Таким образом, если вы хотите использовать эти функции из обычных продуктов, вы должны определить, что используете GCC, поэтому код, который вы должны использовать, будет следующим:

#ifdef __GNUC__
// do my gcc specific stuff
#else
// ... handle this for other compilers
#endif
15
ответ дан 27 November 2019 в 03:43
поделиться

Я перестроил свой ответ ... Блин, редактирую берсерк: P:

Вам не нужно использовать частичный ответ. И, вероятно, для MacOSX, Linux и других Unix-подобных вам вообще не нужно их использовать.

Самый популярный (насколько Google говорит правду) - _WIN32 .

Вы никогда не определяете его «вручную» в исходном коде.Он определяется одним из следующих способов:
как флаг препроцессора / компилятора командной строки (например, g ++ -D _WIN32 )
или он предопределен самим компилятором (большинство компиляторов Windows предопределяют _WIN32 , а иногда и другие, например WIN32 или _WIN32_ . - Тогда вам тоже не нужно чтобы вообще беспокоиться об определении этого, компилятор выполняет всю работу.


И мой старый ответ:

Вам ничего не нужно «делать». Это просто для многоплатформенной совместимости. Часто версия кода для всех Unix -лайки (включая Linux, MacOSX, BSD, Solaris ...) и другие платформы POSIX будут полностью такими же, и должны быть некоторые изменения для Windows. Поэтому люди пишут свой код в основном для Unix-подобных и добавляют некоторые только для Windows ( например, инструкции DirectX, пути к файлам в стиле Windows ...) части между #ifdef _WIN32 и #endif .

Если у вас есть некоторые части, например, X-Window-system только или только для MacOS, вы делаете то же самое с чем-то вроде #ifdef X_WINDOW или #ifdef MACOS . Затем вам нужно установить правильное определение препроцессора, пока c компиляция (с использованием флага -D в gcc, например, gcc -D _WIN32 ).

Если вы не пишете код, зависящий от платформы, вам не нужно заботиться о таких блоках #ifdef, #else, #endif . И большинство компиляторов / препроцессоров Windows AFAIK предопределили некоторые символы, такие как _WIN32 (самый популярный, насколько Google говорит правду), WIN32 , _WIN32_ и т. Д. .Так что, компилируя его в Windows, скорее всего, вам не нужно ничего делать, кроме простой компиляции.

2
ответ дан 27 November 2019 в 03:43
поделиться

Вздох - ни на что не полагайтесь на компилятор - укажите, для какой платформы вы строите, в своем Makefile. Проще говоря, все, что начинается с _, зависит от реализации и не переносимо.

Однажды я попробовал ваш метод в очень большом проекте, и в промежутках между переходами между Sun-C ++ и GCC мы просто решили использовать контроль Makefile, а не пытаться понять, что собираются делать компиляторы.

0
ответ дан 27 November 2019 в 03:43
поделиться

Не понимаю, зачем это нужно. Возможно, вам придется не забыть указать определение вручную в командной строке вашего компилятора, но это все. Для справки, Visual Studio определяет _WIN32 (с одним подчеркиванием), а не __WIN32. Если оно не определено, то оно не определено, и это не имеет значения.

3
ответ дан 27 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

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