Где находятся заголовочные файлы windows

Файлы заголовков (C++) Header files (C++)

Имена программных элементов, таких как переменные, функции, классы и т. д., должны быть объявлены, прежде чем их можно будет использовать. The names of program elements such as variables, functions, classes, and so on must be declared before they can be used. Например, нельзя просто писать x = 42 без предварительного объявления «x». For example, you can’t just write x = 42 without first declaring ‘x’.

Объявление сообщает компилятору, является ли элемент int , a double , функцией class или другим элементом. The declaration tells the compiler whether the element is an int , a double , a function, a class or some other thing. Кроме того, каждое имя должно быть объявлено (прямо или косвенно) в каждом cpp-файле, в котором он используется. Furthermore, each name must be declared (directly or indirectly) in every .cpp file in which it is used. При компиляции программы каждый CPP-файл компилируется независимо в единицу компиляции. When you compile a program, each .cpp file is compiled independently into a compilation unit. Компилятор не имеет сведений о том, какие имена объявляются в других единицах компиляции. The compiler has no knowledge of what names are declared in other compilation units. Это означает, что если вы определите класс или функцию или глобальную переменную, необходимо предоставить объявление этого объекта в каждом дополнительном cpp-файле, который его использует. That means that if you define a class or function or global variable, you must provide a declaration of that thing in each additional .cpp file that uses it. Каждое объявление этого элемента должно быть точно одинаковым во всех файлах. Each declaration of that thing must be exactly identical in all files. Небольшая несогласованность вызовет ошибки или непреднамеренное поведение, когда компоновщик пытается объединить все единицы компиляции в одну программу. A slight inconsistency will cause errors, or unintended behavior, when the linker attempts to merge all the compilation units into a single program.

Чтобы максимально сокращать возможности ошибок, в C++ принято соглашение об использовании файлов заголовков для хранения объявлений. To minimize the potential for errors, C++ has adopted the convention of using header files to contain declarations. Объявления можно сделать в файле заголовка, а затем использовать директиву #include в каждом cpp-файле или другом файле заголовка, для которого требуется это объявление. You make the declarations in a header file, then use the #include directive in every .cpp file or other header file that requires that declaration. Директива #include вставляет копию файла заголовка непосредственно в CPP-файл перед компиляцией. The #include directive inserts a copy of the header file directly into the .cpp file prior to compilation.

В Visual Studio 2019 функция модулей c++ 20 появилась в качестве улучшения и в конечном итоге заменяет файлы заголовков. In Visual Studio 2019, the C++20 modules feature is introduced as an improvement and eventual replacement for header files. Дополнительные сведения см. в разделе Общие сведения о модулях в C++. For more information, see Overview of modules in C++.

Пример Example

В следующем примере показан общий способ объявления класса и его использования в другом исходном файле. The following example shows a common way to declare a class and then use it in a different source file. Начнем с файла заголовка, my_class.h . We’ll start with the header file, my_class.h . Он содержит определение класса, но обратите внимание, что определение не завершено; Функция-член do_something не определена: It contains a class definition, but note that the definition is incomplete; the member function do_something is not defined:

Затем создайте файл реализации (обычно с расширением CPP или аналогичным модулем). Next, create an implementation file (typically with a .cpp or similar extension). Мы вызываем файл my_class. cpp и предоставим определение для объявления члена. We’ll call the file my_class.cpp and provide a definition for the member declaration. Мы добавляем #include директиву для файла «my_class. h», чтобы объявление my_class, вставленное в этот момент в cpp, было включено в объявление для std::cout . We add an #include directive for «my_class.h» file in order to have the my_class declaration inserted at this point in the .cpp file, and we include to pull in the declaration for std::cout . Обратите внимание, что кавычки используются для файлов заголовков в том же каталоге, что и исходный файл, а угловые скобки используются для заголовков стандартной библиотеки. Note that quotes are used for header files in the same directory as the source file, and angle brackets are used for standard library headers. Кроме того, многие заголовки стандартной библиотеки не имеют h или любого другого расширения файла. Also, many standard library headers do not have .h or any other file extension.

Читайте также:  Dashcommand для windows 10

В файле реализации при необходимости можно использовать using оператор, чтобы не указывать каждое упоминание «my_class» или «cout» с «N::» или «std::». In the implementation file, we can optionally use a using statement to avoid having to qualify every mention of «my_class» or «cout» with «N::» or «std::». Не помещайте using операторы в файлы заголовков! Don’t put using statements in your header files!

Теперь можно использовать my_class в другом cpp файле. Now we can use my_class in another .cpp file. Мы #include заголовочный файл, чтобы компилятор запрашивает объявление. We #include the header file so that the compiler pulls in the declaration. Все компиляторы должны иметь представление о том, что my_class — это класс, имеющий открытую функцию-член с именем do_something() . All the compiler needs to know is that my_class is a class that has a public member function called do_something() .

После того как компилятор завершит компиляцию каждого CPP-файла в OBJ-файлы, он передает OBJ-файлы компоновщику. After the compiler finishes compiling each .cpp file into .obj files, it passes the .obj files to the linker. Когда компоновщик объединяет объектные файлы, обнаруживается только одно определение для my_class; Он находится в OBJ-файле, созданном для my_class. cpp, и сборка выполняется. When the linker merges the object files it finds exactly one definition for my_class; it is in the .obj file produced for my_class.cpp, and the build succeeds.

Включить условия Include guards

Как правило, файлы заголовков содержат директиву include или, #pragma once чтобы убедиться, что они не вставляются несколько раз в один CPP-файл. Typically, header files have an include guard or a #pragma once directive to ensure that they are not inserted multiple times into a single .cpp file.

Что следует разместить в файле заголовка What to put in a header file

Поскольку файл заголовка потенциально может включаться в несколько файлов, он не может содержать определения, которые могут формировать несколько определений с одним и тем же именем. Because a header file might potentially be included by multiple files, it cannot contain definitions that might produce multiple definitions of the same name. Следующие действия не разрешены или считаются очень неправильными. The following are not allowed, or are considered very bad practice:

  • встроенные определения типов в пространстве имен или глобальной области built-in type definitions at namespace or global scope
  • невстроенные определения функций non-inline function definitions
  • определения неконстантных переменных non-const variable definitions
  • агрегатные определения aggregate definitions
  • безымянные пространства имен unnamed namespaces
  • Директивы using using directives

Использование using директивы не обязательно приведет к ошибке, но может вызвать проблему, так как она переводит пространство имен в область каждого CPP-файла, который напрямую или косвенно включает этот заголовок. Use of the using directive will not necessarily cause an error, but can potentially cause a problem because it brings the namespace into scope in every .cpp file that directly or indirectly includes that header.

Пример файла заголовка Sample header file

В следующем примере показаны различные виды объявлений и определений, допустимых в файле заголовка. The following example shows the various kinds of declarations and definitions that are allowed in a header file:

Где находится директория хранения заголовочных файлов

Здравствуйте, где находятся стандартные подключаемые файлы?
Нужно сделать обычный модуль,без подключения к ядру. Хочу посмотреть исходники stdio.h и time.h

Иерархия заголовочных файлов
Всем добрых суток! Возник глупый и простой вопрос о заголовочных файлах в силу незнания.

Раскритикуйте мой способ избавления от заголовочных файлов
// positive_math.c — операции с массивом целых неотрицательных чисел #ifndef.

Где находится директория временных профилей?
Доброго времени суток. У меня создаются на сервере 2008 R2 временные пользователи из-за ошибки.

Читайте также:  Dell 5110 windows 10 проблемы

Решение

easybudda, а что подробнее? Занимаюсь изучением ядра linux и параллельно с этим осмысливаю Си на простых примерах.
В этом был вопрос?

Добавлено через 12 минут
А.. понял.
Неправильно написал. Не модуль, просто программу

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Где находится корневая директория для метода open?
необходимо считать текстовый файл пытаюсь InputStream is = getAssets().open(«1.txt»); но в самом.

Где расположен каталог С заголовочных файлов для моего ядра?
What is the location of the directory of С header files that match your running kernel?

Про добавление заголовочных файлов в заголовочных файлах
В который раз эта вещь засовывает мозги в блендер! Я про то, что не могу однозначно запомнить.

Найти, в каком из файлов и где находится указанный код
Добрый вечер! Не могу разобраться с кодом нахождения некоторых файлов! Необходимо.

Урок №21. Заголовочные файлы

Обновл. 26 Мар 2021 |

По мере увеличения размера программ весь код уже не помещается в нескольких файлах, записывать каждый раз предварительные объявления для функций, которые мы хотим использовать, но которые находятся в других файлах, становится всё утомительнее и утомительнее. Хорошо было бы, если бы все предварительные объявления находились в одном месте, не так ли?

Файлы .cpp не являются единственными файлами в проектах. Есть еще один тип файлов — заголовочные файлы (или «заголовки»), которые имеют расширение .h . Целью заголовочных файлов является удобное хранение набора объявлений объектов для их последующего использования в других программах.

Заголовочные файлы из Стандартной библиотеки C++

Рассмотрим следующую программу:

Результат выполнения программы:

В этой программе мы используем cout, который нигде не определяем. Откуда компилятор знает, что это такое? Дело в том, что cout объявлен в заголовочном файле iostream. Когда мы пишем #include , мы делаем запрос, чтобы всё содержимое заголовочного файла iostream было скопировано в наш файл. Таким образом, всё содержимое библиотеки iostream становится доступным для использования.

Как правило, в заголовочных файлах записываются только объявления, без определений. Следовательно, если cout только объявлен в заголовочном файле iostream, то где же он определяется? Ответ: в Стандартной библиотеке С++, которая автоматически подключается к вашему проекту на этапе линкинга.

Подумайте о последствиях отсутствия заголовочного файла iostream. Каждый раз, при использовании cout, вам бы приходилось вручную копировать все предварительные объявления, связанные с cout в верхнюю часть вашего файла! Хорошо ведь, что можно просто указать #include , не так ли?

Пишем свои собственные заголовочные файлы

Теперь давайте вернемся к примеру, который мы обсуждали на предыдущем уроке. У нас было два файла: add.cpp и main.cpp.

Примечание: Если вы создаете все файлы заново, то не забудьте добавить add.cpp в свой проект, чтобы он был подключен к компиляции.

Мы использовали предварительное объявление, чтобы сообщить компилятору, что такое add(). Как мы уже говорили, записывать в каждом файле предварительные объявления используемых функций — дело не слишком увлекательное.

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

Написать свой собственный заголовочный файл не так уж и сложно. Заголовочные файлы состоят из двух частей:

Директивы препроцессора — в частности, header guards, которые предотвращают вызов заголовочного файла больше одного раза из одного и того же файла (об этом детально на следующем уроке).

Содержимое заголовочного файла — набор объявлений.

Все ваши заголовочные файлы (которые вы написали самостоятельно) должны иметь расширение .h .

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

main.cpp, в котором мы подключаем add.h:

add.cpp остается без изменений:

Когда компилятор встречает #include «add.h» , он копирует всё содержимое add.h в текущий файл. Таким образом, мы получаем предварительное объявление функции add().

Примечание: При подключении заголовочного файла, всё его содержимое вставляется сразу же после строки #include . .

Если вы получили ошибку от компилятора, что add.h не найден, то убедитесь, что имя вашего файла точно «add.h». Вполне возможно, что вы могли сделать опечатку, например, просто «add» (без «.h») или «add.h.txt» или «add.hpp».

Если вы получили ошибку от линкера, что функция аdd() не определена, то убедитесь, что вы корректно подключили add.cpp к вашему проекту (и к компиляции тоже)!

Читайте также:  Антивирус для восстановления windows

Угловые скобки (<>) vs. Двойные кавычки («»)

Вы, наверное, хотите узнать, почему используются угловые скобки для iostream и двойные кавычки для add.h. Дело в том, что, используя угловые скобки, мы сообщаем компилятору, что подключаемый заголовочный файл написан не нами (он является «системным», т.е. предоставляется Стандартной библиотекой С++), так что искать этот заголовочный файл следует в системных директориях. Двойные кавычки сообщают компилятору, что мы подключаем наш собственный заголовочный файл, который мы написали самостоятельно, поэтому искать его следует в текущей директории нашего проекта. Если файла там не окажется, то компилятор начнет проверять другие пути, в том числе и системные директории.

Правило: Используйте угловые скобки для подключения «системных» заголовочных файлов и двойные кавычки для ваших заголовочных файлов.

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

Почему iostream пишется без окончания .h?

Еще один часто задаваемый вопрос: «Почему iostream (или любой другой из стандартных заголовочных файлов) при подключении пишется без окончания «.h»?». Дело в том, что есть 2 отдельных файла: iostream.h (заголовочный файл) и просто iostream! Для объяснения потребуется краткий экскурс в историю.

Когда C++ только создавался, все файлы библиотеки Runtime имели окончание .h. Оригинальные версии cout и cin объявлены в iostream.h. При стандартизации языка С++ комитетом ANSI, решили перенести все функции из библиотеки Runtime в пространствo имен std, чтобы предотвратить возможность возникновения конфликтов имен с пользовательскими идентификаторами (что, между прочим, является хорошей идеей). Тем не менее, возникла проблема: если все функции переместить в пространство имен std, то старые программы переставали работать!

Для обеспечения обратной совместимости ввели новый набор заголовочных файлов с теми же именами, но без окончания «.h». Весь их функционал находится в пространстве имен std. Таким образом, старые программы с #include не нужно было переписывать, а новые программы уже могли использовать #include .

Когда вы подключаете заголовочный файл из Стандартной библиотеки C++, убедитесь, что вы используете версию без .h (если она существует). В противном случае, вы будете использовать устаревшую версию заголовочного файла, который уже больше не поддерживается.

Кроме того, многие библиотеки, унаследованные от языка Cи, которые до сих пор используются в C++, также были продублированы с добавлением префикса c (например, stdlib.h стал cstdlib). Функционал этих библиотек также перенесли в пространство имен std, чтобы избежать возможность возникновения конфликтов имен с пользовательскими идентификаторами.

Правило: При подключении заголовочных файлов из Стандартной библиотеки С++, используйте версию без «.h» (если она существует). Пользовательские заголовочные файлы должны иметь окончание «.h».

Можно ли записывать определения в заголовочных файлах?

C++ не будет жаловаться, если вы это сделаете, но так делать не принято.

Как уже было сказано выше, при подключении заголовочного файла, всё его содержимое вставляется сразу же после строки с #include. Это означает, что любые определения, которые есть в заголовочном файле, скопируются в ваш файл.

Для небольших проектов, это, скорее всего, не будет проблемой. Но для более крупных это может способствовать увеличению времени компиляции (так как код будет повторно компилироваться) и размеру исполняемого файла. Если внести изменения в определения, которые находятся в файле .cpp, то перекомпилировать придется только этот файл. Если же внести изменения в определения, которые записаны в заголовочном файле, то перекомпилировать придется каждый файл, который подключает этот заголовок, используя директиву препроцессора #include. И вероятность того, что из-за одного небольшого изменения вам придется перекомпилировать весь проект, резко возрастает!

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

Советы

Вот несколько советов по написанию собственных заголовочных файлов:

Всегда используйте директивы препроцессора.

Не определяйте переменные в заголовочных файлах, если это не константы. Заголовочные файлы следует использовать только для объявлений.

Не определяйте функции в заголовочных файлах.

Каждый заголовочный файл должен выполнять свое конкретное задание и быть как можно более независимым. Например, вы можете поместить все ваши объявления, связанные с файлом А.cpp в файл A.h, а все ваши объявления, связанные с B.cpp — в файл B.h. Таким образом, если вы будете работать только с А.cpp, то вам будет достаточно подключить только A.h и наоборот.

Используйте имена ваших рабочих файлов в качестве имен для ваших заголовочных файлов (например, grades.h работает с grades.cpp).

Не подключайте одни заголовочные файлы из других заголовочных файлов.

Не подключайте файлы .cpp, используя директиву препроцессора #include.

Поделиться в социальных сетях:

Оцените статью