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

StackOverflow https://stackoverflow.com/questions/430424

Вопрос

На этот вопрос уже есть ответ здесь:

Я хотел бы определить, является ли операционная система, на которой я компилирую, 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");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top