Существуют ли какие-либо макросы, чтобы определить, скомпилирован ли мой код для Windows?

Я хотел бы определить, является ли OS, с которой я компилирую, это 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");