Включить окна h что это такое

Обновлено: 21.11.2024

Модульный заголовочный файл Windows.h

Заголовочный файл Windows.h для Win32 API — это огромное количество включаемых файлов, добавляющих сотни тысяч новых макросов, структур и функций.

Этот проект направлен на модульную структуру файла Windows.h, чтобы включить только то, что вам нужно.

Все предложения приветствуются, если мы сделаем это с помощью краудсорсинга, это может быть выполнено намного быстрее. Если каких-либо функций не хватает, добавьте их и отправьте запрос на включение. Я объединю их как можно скорее

Единственный интересующий вас каталог — это include , скопируйте содержимое каталога в свой проект, установите путь включения так, чтобы он указывал на каталог, содержащий каталог win32.

Каталог win32 содержит следующее:

  • Модульные включаемые файлы:
    • windows_base.h
    • atomic.h
    • dbghelp.h
    • dds.h
    • файл.h
    • gdi.h
    • io.h
    • разное.h
    • процесс.h
    • sysinfo.h
    • потоки.h
    • окно.h
    • windows_modular.h
    • windows.h

    windows_base.h включается в каждый модульный включаемый файл, он содержит необходимые типы, макросы и структуры, используемые несколькими модулями.

    Отличия от Microsoft Windows.h

    Мы пытаемся обеспечить полную замену собственных заголовков Microsoft, сохраняя при этом разумную степень совместимости и не нарушая существующий код.

    Однако есть несколько критических изменений, о которых вы должны знать:

    Каталог test содержит простой тестовый пример.

    Тестовый пример состоит из компиляции каждого файла модуля с включенными полными предупреждениями, что гарантирует соблюдение всех зависимостей и отсутствие предупреждений.

    Его можно выполнить, вызвав:

    Требуется CL.EXE и NMAKE.EXE в вашем пути.

    Этот проект содержит части Microsoft Windows SDK. Они лицензированы в соответствии с лицензионным соглашением Microsoft. Чтобы использовать его, вы должны прочитать и согласиться с ним.

    Еженедельный (почти) блог, рассказывающий о (обычно плохих) методах работы с C++

    Автор: Хлоя Лурсейр

    Работая над не очень старым кодом, я столкнулся со странной ошибкой компиляции в MS Visual Studio:

    Вот инкриминируемый код:

    А вот ошибки:

    Он пришел с кучей предупреждений, которые я даже не буду писать здесь.

    Многие из вас, возможно, уже знают виновника, и это следующая строка:

    Действительно, если мы посмотрим на код этой библиотеки, мы увидим удивительный фрагмент кода:

    В свою защиту могу сказать, что файл, в котором возникла ошибка, не содержит windows.h . Он был включен другим заголовком.

    Пояснение

    Тот факт, что в windows.h определены макросы с именами min и max, означает, что на этапе препроцессора компиляции все экземпляры слов min и max будут заменены.

    Это означает, что после предварительной обработки вместо этого:

    Компилятор увидит это:

    Что не имеет смысла, отсюда и упомянутые выше ошибки компиляции.

    Много причин не включать windows.h

    Вот неполный список причин, почему включать этот заголовок не рекомендуется:

    • Одним лишь включением стандартная библиотека нарушается. То, как мы используем функциональные возможности стандартной библиотеки, должно работать независимо от того, какие заголовочные файлы мы включаем.
    • Это заставляет вас определять NOMINMAX и начало каждого заголовка, включающего windows.h . И если вы когда-нибудь забудете об этом, каждый файл, который будет включать ваш заголовок, должен будет определить его.
    • Поскольку это зависит от ОС, лучше избегать его до тех пор, пока это возможно. Если вы используете там, где вам это не нужно, вы не сможете портировать свой код на другие системы, вы можете приобрести плохие привычки кодирования (слишком полагаясь на него) и не забывать, что чем более специфична библиотека , тем меньше он будет поддерживаться.

    Заключение

    В целом существуют способы безопасного использования windows.h, но вы должны быть абсолютно уверены в том, как вы включаете его, чтобы избежать побочных эффектов для других источников и заголовков.

    Не используйте его, пока можете.

    Автор: Хлоя Лурсейр

    Поделиться:

    Вот так:

    Связанные

    4 мысли о «windows.h ломает стандартную библиотеку (и мою волю к жизни)»

    Привет. Недавно я попал в точку, где мне нужно использовать windows.h. Это для имитации нажатия клавиш и других вещей. Теперь проблема, с которой я сталкиваюсь, заключается в том, что оператор

    сообщает об ошибке, что он не найден. Поэтому я проверил его во включаемом файле, и его там не было. ПРИМЕЧАНИЕ ПРИМЕЧАНИЕ ПРИМЕЧАНИЕ. Я использую TurboC++. Итак, я скачал фрагмент кода из сети, сохранил его как windows.h в своем включаемом файле. Но увидев внутренние окна.h я понял, что он просто включает в себя множество других файлов заголовков, которых нет в моем каталоге include. Я проверил в сети эту проблему и увидел, что есть решения для Visual C++ и Dev-C++. Но подскажите, пожалуйста, решение для TurboC++ любой версии. Пожалуйста, опубликуйте ссылку, где я должен скачать все эти библиотеки Windows. Заранее спасибо :)
    Кстати, я просто изучаю C++ в школе, поэтому не могу перейти на Dev-C++, даже если TC++ устарел :D

    SDK означает комплект для разработки программного обеспечения. Это коллекция файлов заголовков (подобных тому, который вы пытаетесь получить), исходных файлов и других файлов.

    Установка будет означать, что у вас есть файлы заголовков, необходимые для работы с
    Windows API.

    Я использую Turbo C++

    Если вы говорите о древнем 16-битном компиляторе Borland, то вы действительно нужно перейти на новый компилятор. Почему вы все еще придерживаетесь Turbo C++, когда есть лучшие бесплатные альтернативы?

    Для Windows можно выбрать GCC (версия MinGW с такой IDE, как Code::Blocks, CodeLite, . ) или Microsoft Visual Studio IDE с компилятором.

    Я использовал Dev-Cpp, MS-VC++10 и MS-VS12, и все они имеют заголовок библиотеки Windows как "Windows.h", поэтому я полагаю, что вы можете попробовать и его.

    Файловая система Windows нечувствительна к регистру, поэтому не имеет значения, в каком регистре используются буквы, когда вы включаете ее. В отличие от Linux.

    Файловая система Windows нечувствительна к регистру

    забыл об этом. конечно, я уже привык к Linux, когда перешел на Windows, поэтому у меня все еще есть привычка писать в правильном регистре (когда это имеет большое значение на форуме). я все еще использую cd Desktop, хотя я мог бы сделать cd desktop

    Файловая система Windows нечувствительна к регистру

    Вы говорите о системе препроцессора компилятора или фактической системе файлов окна, потому что я почти уверен, что у меня было много ошибок из-за одной буквы в моих операторах include!

    EDIT: Хм, неважно. Только что проверил это, и оно работает так, как я хочу, я уверен, что у меня были времена, когда это не работало через корпус:/

    Вы говорите о системе препроцессора компилятора

    надеюсь, он говорит о файловой системе. препроцессоры должны быть чувствительны к регистру

    Лол, я уже упоминал. Я студент и просто изучаю Turbo C++ и не хочу переключаться на Dev-C++ или какие-то другие IDE, потому что это помогает мне получать оценки на экзаменах и не запутаться: D

    У меня было много ошибок из-за регистра одной буквы в моих операторах включения

    Ну да, штука внутри включения <> всегда НЕЗАВИСИМ ОТ РЕГИСТРА. место, где мы получаем ошибку, набирает код как:

    Нет, я не думаю, что когда-либо делал это, возможно, меня просто спутали с чем-то другим.
    А может это так?

    В ЛЮБОМ СЛУЧАЕ. Вернемся к операционному вопросу!

    Хм, во время загрузки SDK для Windows 7 он застрял в той части, где написано «загрузка». проблема в моем компьютере или загрузке?

    Где я могу загрузить его SDK?

    Обычно вы получаете Windows SDK с веб-сайта Microsoft.< /p>

    Но разве Turbo C++ не является 16-битным компилятором? (=> см. 2-е «Правка» чуть ниже.)

    (Редактировать: какую версию Turbo C++ вы используете?И вы имеете в виду "Borland Turbo C++" или "Borland C++"??)

    (Редактировать: я вижу, что Turbo C++ сделал его 32-разрядным. Опубликуйте версию 3.0 (с синим экраном). Итак, если вы используете версию 4.5 (с серым экраном) ??)

    Если это так, у вас проблемы. Пакеты SDK, доступные от Microsoft, предоставляют библиотеки только для 32-разрядного и 64-разрядного использования. Вам нужен SDK для 16-битной Windows, который недоступен для загрузки обычным способом. (Оплаченным подписчикам MSDN он все еще может быть доступен из хранилищ, но у меня нет доступа.)

    Чтобы проверить, создает ли ваш компилятор 16-разрядные исполняемые файлы, запустите приложение и каким-либо образом поддерживайте его работу.

    Затем откройте Диспетчер задач, найдите свое приложение в списке "Приложения", щелкните его правой кнопкой мыши и выберите "Перейти к процессу". Если ваше приложение 16-разрядное, процесс, к которому вы переходите, будет называться ntvdm.exe, а не именем вашего собственного приложения.

    PS Этот вопрос поднимался снова и снова.

    Но с какой стати кто-то использует Turbo C++ в наши дни, когда существуют гораздо лучшие бесплатные альтернативы? MinGW GCC плюс достойный редактор был бы лучше!! (вероятно, если профессор/учитель предоставил сценарий сборки/создать файл для начала.)

    Где я могу скачать его SDK?

    Последний выпуск версии 8.0, но я использую версию 7.1 на мои старые машины. В последней версии (для Windows 8) добавлена ​​поддержка новых приложений в стиле Metro, которые добавляют немного сложности, поэтому на данный момент их лучше избегать.

    Для веб-установки (вы устанавливаете с помощью веб-установщика непосредственно с веб-сайта Microsoft)

    Для установки ISO (вы загружаете образ ISO, записываете DVD и устанавливаете с DVD)

    PS Для последней версии 8.0

    Для веб-установки

    (Не удалось найти установку ISO для версии 8.0?)

    Есть также предварительная версия 8.1, но вы должны использовать ее только в том случае, если вам нужно использовать какую-то совершенно новую функцию Windows 8. Поскольку вы используете Windows XP, это здесь не имеет значения.

    SwatSid написал:
    Кстати, я просто изучаю C++ в школе, поэтому не могу перейти на Dev-C++, даже если TC++ устарел :D

    Черт побери, смени школу, какого черта они должны учить тебя, старина?
    Это все равно, что учить вас делать колесо голыми руками: оно работает, но его легко сломать, и есть более новые способы сделать это.
    И, что еще хуже, это БЕСПОЛЕЗНО, потому что вам придется заново изучать C++ после того, как вы обновитесь, из-за стандартизированных функций C++03 и C++11 (и C++ 14 скоро).

    Если вы на самом деле не планируете продолжать разработку программ, это нормально, но если вы планируете двигаться дальше, я советую вам избегать использования TC++.
    Кроме того, если вы планируете получить Dev-C++, не берите версию Bloodshed, а берите версию Orwell, которая продолжает обновляться, так как версия Bloodshed застряла.
    Если вместо этого вы планируете получить CodeBlocks, получите его с включенным MinGW, его будет проще установить.

    Я немного просмотрел наш (игровой движок Unity) гигиену заголовочных файлов кодовой базы C++, и это короткий разглагольствования о .

    На всех платформах Microsoft наш предварительно скомпилированный заголовок включался примерно навсегда, поэтому фактически вся кодовая база получала из него все символы и макросы. Теперь, конечно, часть кодовой базы, которая на самом деле нужна для использования Windows API, очень мала, поэтому я подумал: «Эй, давайте посмотрим, что произойдет, если я перестану делать заголовки Windows включаться везде».

    Но зачем вам это?

    Хороший вопрос! Я пока не знаю, знаю ли я. Концептуально, поскольку только очень небольшая часть кодовой базы должна использовать материал из заголовков Windows, «чувствует себя неправильным» включать его повсюду. Возможно, имеет смысл сохранить его в предварительно скомпилированном заголовке, если это поможет повысить производительность сборки.

    «Предварительно скомпилированные заголовки, дедушка?! А как насчет модулей C++?»

    Это правда, что модули C++, возможно, однажды сделают предварительно скомпилированные заголовки устаревшими. Приятно видеть, что основные компиляторы (MSVC, clang, gcc) теперь имеют некоторый уровень их реализации.

    Не все наши платформы используют эти компиляторы; а некоторые другие еще не в достаточно свежих версиях. Итак... я не знаю, через несколько лет? Но, может быть, к тому времени мы просто напишем Rust, кто знает :)

    В любом случае. Насколько он велик на самом деле? В VS2017 (версия 15.5, Windows SDK 10.0.16299) после предварительной обработки и игнорирования пустых строк получается 69100 строк фактического кода. При определении WIN32_LEAN_AND_MEAN перед включением для сокращения некоторых редко используемых частей получается 33375 строк. Это не огромно, но и не так уж мало.

    Для сравнения, вот количество строк (после предварительной обработки, удаления пустых строк) различных заголовков STL в одном и том же компиляторе:

    • 20354
    • 26355
    • 24291
    • 21144
    • 18578
    • вектор+строка+unordered_map+алгоритм 35957
    • 1800; просто само собой: 1184. C был маленьким и аккуратным!

    Актуальная проблема с windows.h: макросы

    Вернемся к текущей задаче! Итак, удалите из предварительно скомпилированного заголовка, нажмите «Сборка» и вперед, возможно, разбросав нужные окна здесь и там, верно? Конечно, неправильно :)

    Другие говорят это более резко, но суть такова: заголовки Windows определяют множество символов как макросы препроцессора. В то время как минимальные и максимальные значения являются необязательными (перед включением определите NOMINMAX), некоторые другие, такие как ближний и дальний, не являются обязательными.

    И, конечно же, набор имен функций, которые Windows преобразует в варианты ANSI или Unicode с помощью препроцессора. SendMessage, GetObject, RegisterClass, DrawText, CreateFile и так далее. Хорошо, что это малоизвестные имена, которые ни в коем случае не захочет использовать другая кодовая база… о, подождите. Именно эти имена функций вызвали проблемы при моей попытке.

    Но есть и сторонние библиотеки, которые включают windows.h из собственных заголовочных файлов. Я смотрю на вас, Enlighten, Oculus PC SDK, CEF и другие. Уф!

    Модульные/маленькие окна.h

    Конечно, есть и другие способы решения этой проблемы.

    Один из них заключается в том, чтобы не иметь ничего специфичного для Windows во многих/любых из ваших файлов заголовков, обернуть все в хороший небольшой набор исходных файлов, специфичных для Windows, включить туда только заголовки Windows и продолжать делать забавные вещи. Это было бы идеально, но это не пятиминутная работа в большой существующей кодовой базе.

    Если вам не нужно много вещей из заголовков Windows, вы можете объявить минимальный набор, который вам нужен, самостоятельно, вручную. Вопреки тому, что говорят некоторые потоки переполнения стека («почему WAIT_OBJECT_0 определяется как STATUS_WAIT_0 + 0? потому что значения могут быть другими в будущем!») изменить их значения), это не очень опасно. В конце концов, Windows API — один из самых стабильных API в истории вычислительной техники.

    Вот пример минимального набора определяемых вручную элементов Windows, необходимых для Direct3D 9, от @zeuxcg: Минимальный набор заголовков для D3D9.

    Другой пример — довольно обширная замена заголовков Windows вручную от @ArvidGerstmann: Modular Windows.h Header File.

    Однако даже сами заголовки Windows можно использовать гораздо более модульным образом напрямую! На данный момент я нашел следующее:

    Читайте также: