Я хотел бы определить, является ли OS, с которой я компилирую, это Windows. Есть ли простой макрос, который я могу проверить, чтобы убедиться, что?
Существуют ли какие-либо макросы, чтобы определить, скомпилирован ли мой код для Windows?
Ответ 1
[Edit: Я предполагаю, что вы хотите использовать макросы времени компиляции, чтобы определить, в какой среде вы находитесь. Возможно, вы хотите определить, работаете ли вы под Wine под Linux или что-то вместо Windows, но в целом ваш компилятор нацелен на определенную среду, и это либо Windows (DOS), либо нет, но редко (никогда?) оба.]
Некоторые компиляторы предлагают макросы для указания среды сборки Windows. Но они будут варьироваться от компилятора к компилятору и даже к одному и тому же компилятору в Windows, если целевая среда не является исключительно окнами. Обычно это __WIN32__
, но не всегда.
#if defined (__WIN32__)
// Windows stuff
#endif
Иногда это может быть _WIN32
, __CYGWIN32__
или, возможно, только индикатор компилятора (_MSC_VER
).
Если вы знаете среду, в которой вы будете строить (из файла makefile), вы обычно можете перейти в #define
в командной строке, например "g++ -D __WIN32__ yourfile.c
".
Ответ 2
Существует множество способов обнаружения среды компиляции, хоста и среды выполнения. Все зависит от того, что вы хотите знать. Существует три обширных типа сред:
- Build. Это среда, в которой скомпилирована программа.
- Хост. Это среда, в которой выполняется программа.
- Цель. В случае инструментов генерации кода (таких как компиляторы) это будет сгенерированный код.
Если вы выполняете кросс-компиляцию, среда сборки и хоста может быть совершенно другой (это часто встречается при создании встроенных приложений, но не очень часто используется при создании приложений на рабочем столе/сервере), и вы, как правило, не можете запускать скомпилированный двоичный файл на система, используемая для ее компиляции. В противном случае среда хоста должна быть совместима со средой сборки: например, создание приложения на XP, которое будет работать в Vista.
Макросы препроцессора C не могут использоваться, чтобы сообщить вам сведения о системе хоста (например, то, что вы используете); они могут только рассказать вам, для чего был скомпилирован код. В случае Windows два наиболее важных макроса:
- _WIN32 означает, что доступен Win32 API. Он не сообщает вам, какой компилятор вы используете, на самом деле _WIN32 определяется как при использовании Cygwin GCC, так и MinGW GCC. Таким образом, не используйте _WIN32, чтобы выяснить, скомпилированы ли вы с помощью Visual Studio.
-
_MSC_VER
сообщает вам, что программа компилируется с помощью Microsoft Visual C/С++. Ну, почти._MSC_VER
также, определенный при использовании компилятора Intel С++, который предназначен для замены Visual С++.
Есть несколько других макросов, описанных в документации Visual Studio.
Если вы хотите узнать, какую именно версию Windows вы используете, вам придется использовать функции времени выполнения, такие как GetVersion() (как описано в других ответах).
Вы можете получить более конкретные ответы, если вы скажете нам, что именно вы хотите проверить.
Ответ 3
% touch foo.C ; g++ -dM -E foo.C
Проделайте отличную работу по перечислению всех макросов (# define), автоматически определяемых для вас вашим компилятором [machine specific] g++.
Может быть что-то подобное для компиляторов Microsoft...
Ответ 4
Эти три строки помогут вам обнаружить, сначала мы или большинство предопределенных окон объединяем одно определение макроса 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
Ответ 5
Если вы используете целевой код MS Windows, вы можете вызвать GetVersion() или GetVersionEx() для получения дополнительной информации и определить вариант Windows, в котором вы работаете.
Для получения дополнительной информации просмотрите информацию MSDN.
http://msdn.microsoft.com/en-us/library/ms724451(VS.85).aspx
Ответ 6
Эта вещь работает в visual studio 2012, и другой компилятор cgwin g++. Вырезать и вставить его вокруг но это, как правило, так тонко, как получается Все, что он делает, это обнаружить системы windows op. Просто примените количественную оценку: Если не выиграть Тогда * inux : 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;
}
Ответ 7
Ссылки, упомянутые до сих пор, указывают информацию во время компиляции. Вы можете установить флаги внутри этих сегментов кода во время компиляции.
Тем не менее, я думаю, что то, о чем вы просите, больше соответствует строкам "Какая версия окон я под управлением?", а не "Я скомпилирован для работы под окнами?" Надеюсь, что правильное предположение.
В С# это относительно просто. Вы можете ссылаться на System.Environment.OSVersion, а затем посмотреть в разделе "Платформа".
Однако вы спрашиваете о С++. Какой компилятор вы используете? Это имеет большое значение в отношении того, как вы проверяете версию операционной системы, так как нет единого стандарта для получения этой информации (что я нашел).
В Visual С++ используйте Google, чтобы найти информацию о GetVersion/GetVersionEx. Оба предоставят вам структуры, содержащие информацию о текущей версии Windows, в которой работает программа.
Ответ 8
Компилятор MSVС++ (не windows.h
) определяет _WIN32
для всех построений, поэтому это более безопасный макрос для проверки. Компилятор MinGW gcc тоже. Любая среда кросс-компиляции, ориентированная на Win32, также должна установить это.
Ответ 9
На самом деле я бы пошел с Окружающей средой. getenv() является стандартной библиотечной функцией, и, возможно, это единственный потенциально переносимый способ сделать это. Трюк выясняет, какие переменные уникальны для всех ОС. Windows имеет ComSpec, appdata, Windir, systemroot и systemdrive, которые должны быть установлены. Вы также можете strstr переменная пути для WINDOWS или WINNT, но это может быть неточно. Я не эксперт Linux/эксперт Solaris/MacOS, поэтому кто-то еще может сказать вам, какие "стандартные" переменные среды существуют в этих ОС. CygWin также может вызвать некоторые проблемы.
Ответ 10
Вероятно, это зависит от используемого компилятора, но попробуйте:
#ifdef WIN32
...
#endif
Ответ 11
Макросы, подобные перечисленным выше, сообщат вам, была ли ваша программа скомпилирована (или, скорее, для) компьютера Windows, а не запущена ли она на компьютере Windows.
Если вы пишете что-то, что полностью не зависит от платформы (то есть обрабатывает только открытие/чтение/обработку/запись) файловых потоков... вам придется выполнить некоторый тест, например открыть файл, который должен существовать, если на компьютере установлена Windows. Если ваша программа использует только стандартные stdio, math и т.д., То это будет так.
В противном случае, если ваш код содержит системные вызовы Windows, он просто не будет работать на любой другой платформе.
Вы можете написать какой-нибудь макрос, например:
#define RUNNING_ON_WINDOWS ( ... some test )
Только не используйте его для условной компиляции, то есть:
if (RUNNING_ON_WINDOWS) {
...
} else
printf("Windows Required\n");