Существуют ли какие-либо макросы, чтобы определить, компилируется ли мой код в Windows?[дубликат]
-
08-07-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
Я хотел бы определить, является ли операционная система, на которой я компилирую, Windows.Есть ли простой макрос, который я могу проверить, чтобы убедиться в этом?
Решение
[Править:Я предполагаю, что вы хотите использовать макросы времени компиляции, чтобы определить, в какой среде вы находитесь.Возможно, вы хотите определить, работаете ли вы на Wine под Linux или что-то еще вместо Windows, но в целом ваш компилятор нацелен на определенную среду, и это либо Windows (DOS), либо нет, но редко (никогда?) и то, и другое.]
Некоторые компиляторы предлагают макросы для указания среды сборки Windows.Но они будут варьироваться от компилятора к компилятору и даже в одном и том же компиляторе в Windows, если целевая среда не исключительно Windows.Обычно это __WIN32__
, но не всегда.
#if defined (__WIN32__)
// Windows stuff
#endif
Иногда это может быть _WIN32
, __CYGWIN32__
, или , возможно , просто индикатор компилятора (_MSC_VER
).
Если вы знаете среду, в которой будете создавать (из makefile), то обычно вы можете передать #define
в командной строке, например "g++ -D __WIN32__ yourfile.c
".
Другие советы
Существует несколько различных способов определения сред компиляции, хоста и времени выполнения.Все зависит от того, что именно вы хотите знать.Существует три основных типа сред:
- Строить:Это среда, в которой компилируется программа.
- Ведущий:Это среда, в которой выполняется программа.
- Цель:В случае инструментов генерации кода (таких как компиляторы), именно здесь будет выполняться сгенерированный код.
Если вы кросс-компиляция, среда сборки и хостинга могут быть совершенно разными (это часто встречается при создании встроенных приложений, но не очень часто при создании приложений для настольных компьютеров / серверов), и вы, как правило, не можете запустить скомпилированный двоичный файл в системе, используемой для его компиляции.В противном случае среда хоста должна быть совместима со средой сборки:например, создание приложения на XP, которое будет работать на Vista.
Макросы препроцессора C не могут быть использованы для информирования вас о деталях хост-системы (т.е.на чем вы работаете);они могут только сказать вам, для чего был скомпилирован код.В случае Windows двумя наиболее важными макросами являются:
- _WIN32 ( ВЫИГРЫШ ) означает, что доступен Win32 API.Это делает не сообщите вам, какой компилятор вы используете, на самом деле _WIN32 определяется как при использовании GCC Cygwin, так и GCC MinGW.Итак, не используйте _WIN32, чтобы выяснить, компилируетесь ли вы с помощью Visual Studio.
_MSC_VER
сообщает вам, что программа компилируется с помощью Microsoft Visual C / C ++.Ну, почти._MSC_VER
является также определяется при использовании компилятора Intel C ++, который предназначен для замены Visual C ++.
Существует множество других макросов, описанных в документации Visual Studio.
Если вы хотите знать, какую точную версию Windows вы используете, вам придется использовать функции среды выполнения, такие как GetVersion() (как описано в других ответах).
Вы могли бы получить более конкретные ответы, если бы точно сообщили нам, что вы хотите проверить.
% touch foo.C ; g++ -dM -E foo.C
Будет проделана хорошая работа по перечислению всех макросов (#define), автоматически определенных для вас вашим компилятором g ++ [для конкретной машины].
Возможно, есть что-то подобное для компиляторов Microsoft...
Эти три строки помогут вам с обнаружением, во-первых, мы или большинство предопределенных подсказок Windows объединены в одно определение макроса OS_WIN:
#if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__) #define OS_WIN #endif
Затем вы можете проверить это с помощью препроцессора ifdef:
#ifdef OS_WIN //Windows specific stuff #else //Normal stuff #endif
Если вы используете целевой код MS Windows, вы можете вызвать GetVersion() или GetVersionEx() для получения дополнительной информации и определения варианта Windows, в которой вы работаете.
Для получения дополнительной информации ознакомьтесь с информацией MSDN.
http://msdn.microsoft.com/en-us/library/ms724451 (ПРОТИВ 85).aspx
Эта штука работает в Visual Studio 2012 и другом компиляторе g ++ от cgwin.Вырежьте и вставьте его вокруг но это, как правило, настолько тонко, насколько это возможно Все, что он делает, это обнаруживает операционные системы Windows.Просто примените количественную оценку:Если не выиграешь Тогда * добавляйся : D наслаждайся
#include <string>
#include <iostream>
#include <fstream>
#include <cstdlib>
Using namespace std;
int main(){
char chCap; int i = 0;
const int MAX_BUFFER = 70;
char buffer[MAX_BUFFER];
string cmd="ver";
FILE *stream = _popen(cmd.c_str(), "r");
if (0 != stream){
while (!feof(stream)){
//One way is here
//chCap = fgetc(stream);
//cout << chCap;
//buffer[i++] = chCap;
//This one seams better
fgets(buffer, MAX_BUFFER, stream);
}
_pclose(stream);
}
cout << endl;
cout << buffer << endl;
//The op sys detection starts here
string opSys(buffer); //char array to string
if("Microsoft" == opSys.substr(0,9)){
cout << "You are in a Microsoft envornment " << endl;
}
system("pause");
return 0;
}
Ссылки, упомянутые до сих пор, указывают информацию во время компиляции.Вы можете установить флаги внутри этих сегментов кода во время компиляции.
Однако я думаю, что то, о чем вы спрашиваете, больше похоже на то, "Под какой версией Windows я работаю?", а не "Скомпилирован ли я для работы под Windows?" Я надеюсь, что это правильное предположение.
В C # это относительно просто.Вы можете обратиться к System.Environment.OSVersion затем посмотрите в разделе "Платформа".
Однако вы спрашиваете о C ++.Какой компилятор вы используете?Это имеет большое значение для того, как вы проверяете версию операционной системы, поскольку не существует единого стандарта для получения этой информации (который я нашел).
В Visual C ++ используйте Google, чтобы найти информацию о GetVersion / GetVersionEx.Оба варианта предоставят вам структуры, содержащие информацию о текущей версии Windows, под управлением которой запущена программа.
Компилятор MSVC ++ (не windows.h
) определяет _WIN32
для ВСЕ строит, так что это более безопасный макрос для проверки.Компилятор MinGW gcc делает то же самое.Любая среда кросс-компиляции, ориентированная на Win32 следует установите и это тоже.
На самом деле я бы предпочел Окружающую Среду.getenv() - это стандартная библиотечная функция, и поэтому, вероятно, это единственный потенциально переносимый способ сделать это.Хитрость заключается в том, чтобы выяснить, какие переменные уникальны для всех операционных систем.Windows имеет ComSpec, appdata, Windir, systemroot и systemdrive, которые должны быть установлены.Вы также можете strstr ввести переменную path для WINDOWS или WINNT, но это может быть неточно.Я не эксперт по Linux shell / Solaris / macOS, поэтому кто-то другой мог бы рассказать вам, какие "стандартные" переменные окружения существуют в этих ОС.CygWin тоже может вызвать у вас некоторые проблемы.
Вероятно, это будет зависеть от используемого вами компилятора, но попробуйте:
#ifdef WIN32
...
#endif
Макросы, такие как перечисленные выше, сообщат вам, была ли ваша программа скомпилированный на (или , скорее ,, для) компьютер с Windows, не если это так Выполняется на компьютере с Windows.
Если вы пишете что-то, что полностью не зависит от платформы (т.е.он обрабатывает только потоки файлов (открытие / чтение / обработка / запись) ..вам нужно будет выполнить некоторый тест, например открыть файл, который должен существовать, если компьютер работает под управлением Windows.Если ваша программа использует только стандартный stdio, math и т.д..так оно и будет на самом деле.
В противном случае, если ваш код содержит системные вызовы, специфичные для Windows, он просто не будет выполняться ни на какой другой платформе.
Вы могли бы написать какой-нибудь макрос, например:
#define RUNNING_ON_WINDOWS ( ... some test )
Просто не используйте его для условной компиляции, т. е.:
if (RUNNING_ON_WINDOWS) {
...
} else
printf("Windows Required\n");