Каталог расширений

Популярные теги

3gp       avi       fb2       jpg       mp3       pdf      

Как создать заголовочный файл c


09) Создание заголовочных файлов - Разные уроки по Программированию

Создание заголовочных файлов .h

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

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

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

    И при необходимости подключать данные готовые наборы к нужным проектам.

Пример:

    Для создания отдельного файла с функциям или процедурами и в C++ необходимо создать 2 файла с одним и тем же именем например но разными расширениями.

1) Файл содержащий код процедур и функций MyFaileForFunck.cpp 


2) Файл заголовка функции будет содержать ссылку на функцию в виде ее заголовка MyFaileForFunck.h


Подключение Файлов к проекту.

    Для того чтобы подключить данный набор процедур и функций к проекту необходимо скопировать 2 файла в папку с исходным кодом вашей программы. 

    Туда где лежит файл с расширением  cpp


    Если заголовочный файл лежит в той же папке что проект мы должны в операторе #include использовать двойные кавычки. Если мы положили файл в папку Include нашей среды разработки значит мы должны использовать <имя файла >  косые скобки.

    После подключения данного заголовочного файла нам станет доступна функция или функции описанные в данном файле.


Компилирование заголовочных файлов или документация на халяву / Хабр

Для кого эта статья

Вряд ли опытные C++ разработчики найдут что-нибудь новое и интересное в этой статье. Максимум банальную команду
gcc -c -x c++ -I ./ */*/*/*/*.h
которую они и так знают.
А вот если Вы — разработчик начинающий, или только в первый раз строите документацию по своему проекту, или пробовали это однажды, но увидев тот бред, что сгенерировал doxygen, удалили его и забыли как страшный сон, добро пожаловать под кат, скорее всего Вы найдете дальше парочку полезных мыслей.

Введение

Программирование на языке C++ — это в первую очередь анализ существующего кода.
Вот уже несколько лет я принимаю участие в разработке системы имитационного моделирования. Разработка ведется на великом и могучем… детище Страуструпа. И, надо сказать, сей проект уже давно пишется не столько на C++, сколько на собственном диалекте из макросов (ниже станет понятно, почему это важно). Думаю ситуация такая знакома многим C++ девелоперам.

Когда я только начинал изучать этот проект, мне сразу посоветовали построить по нему документацию с помощью doxygen’а. Но по каким-то причинам дружба с этим инструментом не заладилась, и вспомнил в следующий раз я о нем уже спустя годы.

Предыстория

Время шло, мой профессионализм (как я надеюсь) рос, проект развивался и захотелось мне навести порядок в библиотеке, которую активно правил. Под порядком здесь подразумевается концепция один заголовочный файл = одна сущность (или несколько небольших и тесно связанных), а также разделение всех файлов на три типа — заголовочные, внутренние и исходными — соответственно, *.h, *.inl, *.cpp. Причем разделение должно пройти таким образом, чтобы в заголовочных файлах не осталось определения ни одной функции-члена класса, а все они были либо в cpp-файлах, либо в inl-файлах. Помимо этого весь код модуля должен был быть отформатирован по единому стандарту, и, что самое интересное, большинство сущностей должны были быть откомментированны с использованием специальных команд doxygen’а (\interface, \class, \todo, \brief, \enum и прочие).
Проблема

Сказано — сделано. Спустя примерно несколько недель убитых вечеров безумная задача выполнена! Код красив так, что чуть слеза не наворачивается.
И настало время откинуться на спинку стула в ожидании, пока doxygen построит мне красивейшую и правильнейшую документацию с описанием моего (на тот момент уже самого любимого) модуля системы. И вот с замиранием сердца
cd Project/doc
doxygen project-doxyfile
cd html/
./index.html

Однако то, что предстало моему взору было, мягко говоря, фигней. Doxygen откровенно схалтурил: диаграммы неполные, namespace’ыпустые, макросы мне пытается за функции выдать, в общем всего не перечесть… Но первичный анализ показал, что он не понял макросы (все namespace’ы, умные указатели (собственного производства, кстати) и многое другое было задано с помощью макросов).
Решение в опции PREDEFINED?

Под подозрение в первую очередь попали настройки doxygen’а. Были перепроверены такие опции как ENABLE_PREPROCESSING, MACRO_EXPANSION, EXPAND_ONLY_PREDEF, SEARCH_INCLUDES и INCLUDE_PATH. Но настройки выглядели логично, а макросы правильно восприниматься не стали. Тогда в ход пошла опция PREDEFINED, хотя она и не отвечала на вопрос “почему doxygen лажает?”, но позволила ему объяснить нужные макросы. Это и стало решением проблемы на некоторое время. Но тот факт, что нужно было постоянно дописывать в эту опцию все новые макросы, весьма удручал и заставил продолжить изучение doxygen’а.
Проблема в коде!

Долго думал я над поведением doxygen’а и гуглил. А однажды даже слил его себе по svn с праведной мыслью найти и пофиксить страшный баг, мешающий ему обрабатывать макросы :)

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

А вот с doxygen’ом это не проходит — заголовочный файл анализируется как самостоятельный, самодостаточный документ с исходным кодом. И если в нем не хватает объявлений используемых сущностей (которые появляются в контексте использования данного заголовочного файла), то doxygen будет ошибаться. И очень похоже, что именно эта болезнь постигла наш проект.

Так какая же ошибка, неуловимая для компилятора, затаилась в заголовочном файле? Это недостоющии #include директивы тех файлов, где были определены пресловутые макросы. Т.е. при компиляции cpp-файлов все определения попадали в текущую единицу трансляции каким-нибудь обходным путем, а не через “проблемный” заголовочный файл. После этого открытия в нашей команде прошло совещание, с главным вопросом на повестке дня “и что с этим делать, собственно говоря?”. Вопрос был решен в пользу того, что подобное поведение — отсутствие всех нужных инклудов — ошибка. Основной довод весьма прост — заголовочный файл потенциально может быть включен куда угодно, и значит должен быть настолько самодостаточен, чтобы скомпилироваться.

Решение — “компиляции заголовочных файлов”

Вот тут-то и стал вопрос о “компиляции заголовочных файлов”.
Смысл этого мероприятия — заставить компилятор проанализировать все заголовочные файлы без внесения их в контекст исходных (*.cpp) файлов, и сообщить об ошибках. И тогда, если их исправить, то у doxygen’а не должно остаться никаких отмазок, чтобы правильно построить документацию по проекту со всеми диаграммами и прочим.

Теперь пришло время поговорить непосредственно о компиляторе, используемом в нашей команде.
По историческим причинам это ms visual studio, стандарта аж 2008-го года. Но буквально перед финалом данной истории успешно завершился проект перевода вычислительного ядра системы под GNU/Linux. И естественным образом в данной среде был выбран в качестве компилятора GCC, версии 4.6.
И начал терзать его просьбами я, мол скомпилируй мне заголовки. И долго сопротивлялся он… пока не прогнулся.
Вдумчивое чтение его man’а указало мне опцию -I, с помощью которой GCC можно указать путь, от которого стоит искать инклуды в кавычках.
Здесь же следует отметить один немаловажный факт, в проекте своем мы уже давно (и весьма успешно) придерживаемся правила “указывай путь к файлу в инклуде от корня проекта”. Эта дисциплинированность позволила обойтись единственной опцией -I.
Далее осталось подать на вход gcc все заголовочные файлы проекта. Но здесь вышла некоторая заминка связанная с нежеланием gcc принимать на вход выход команды ls через конвейер. Но решение оказалось еще тривиальнее, gcc и так осуществлял поиск входных файлов по переданной маске.
Таким образом, команда
g++ -I ./ */*/*/*/*.h */*/*/*.h */*/*.h
полностью осуществляет валидацию всех заголовочных файлов библиотеки.
Следующий раз gcc начал сопротивляться, если ему дать на вход *.inl файлы. Помогли опции -c (только компиляция без линковки), и -x c++ (явное задания языка программирования).
Итоговая команда, используемая для валидации заголовочных (*.inl файлы мы решили оставить в покое) файлов:
gcc -c -x c++ -I ./ */*/*/*/*.h */*/*/*.h */*/*.h

Ну что ж, осталось исправить ошибки и пользоваться doxygen’ом.

И, в общем-то, еще, наверняка, можно кое-что улучшить, например, прикрутить сюда cmake, но основная мысль данного поста именно в необходимости “компиляции заголовочных файлов” для борьбы с, казалось бы, странным поведением doxygen’а. Так что на этом остановлюсь, пока не утомил последнего самого усидчивого читателя ;)

Вместо выводов

И собственно, почему пост называется “… или документация на халяву”.
Да просто в коде может не быть ни одной строчки doxygen’овского комментария, но все равно можно построить по нему документацию со всевозможными диаграммами, что может очень помочь при изучении нового проекта. А именно автоматическое построение документации (с удобной навигацией и диаграммами) должно было облегчить новым студентам (а все это происходит в техническом ВУЗе) изучение весьма большой и сложной системы и являлось первоначальной целью использования doxygen в нашем проекте.

Естественно, в комментариях жду конструктивную критику, исправления, дополнения моих в меру кривых команд и вопросы.

C: Заголовочные файлы - Linux FAQ

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

Заголовочные файлы подключаются к файлам исходного кода приложения по мере необходимости с помощью директивы #include.

#include "sums.h"

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

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

#ifndef SUMS_H
#define SUMS_H

#endif /*SUMS_H*/

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

#if x86_64
#include "system64.h"
#elif x86
#include "system32.h"
#endif

Пример

В данном простом примере функция вывода приветствия находится в отдельном файле исходного кода (hello.c), который подключается к основному файлу исходного кода программы (hellomain.c) с помощью заголовочного файла (hello.h).

Это содержимое файла исходного кода hello.c:

  1. #include <stdio.h>

  2.  

  3. void print_hello(void)

  4. {

  5.         printf("Hello worldn");
  6. }

Загрузить исходный код примера

Это — содержимое файла исходного кода hello.h:

  1. #ifndef HELLO_H

  2. #define HELLO_H

  3.  

  4. void print_hello(void);

  5.  

  6. #endif /*HELLO_H*/

Загрузить исходный код примера

А это — содержимое файла исходного кода hellomain.c:

  1. #include <stdio.h>

  2. #include "hello.h"

  3.  

  4. int main()

Многофайловые программы. Урок 21 курса "Основы языка C"

Объектный код

Запуск gcc позволяет обработать файл с исходным кодом препроцессором и далее скомпилировать его. Однако при этом сам инструмент gcc не компилирует файл исходного кода в конечный исполняемый файл. Он компилирует его в объектный файл, после чего вызывает так называемый линковщик, или компоновщик. Но зачем надо сначала получать объектный файл, а потом из него уже исполняемый? Для программ, состоящих из одного файла, такой необходимости нет. Хотя при желании здесь также можно отказаться от компоновки, если выполнить команду gcc с ключом -c:

 gcc -c hello.c

В результате получится файл с расширением *.o. Чтобы получить из объектного файла исполняемый, надо использовать ключ -o:

 gcc -o hello hello.o 

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

Компиляция программы, состоящей из нескольких файлов исходного кода

Рассмотрим пример. Пусть в одном файле определена пара функций, а в другом, содержащем функцию main(), осуществляется их вызов.

Файл superprint.c:

#include <stdio.h>   void l2r(char **c, int n) { int i, j; for(i=0; i<n; i++, c++) { for (j=0; j<i; j++) printf("\t"); printf ("%s\n",*c); } }   void r2l(char **c, int n) { int j; for(; n>0; n--, c++) { for (j=1; j<n; j++) printf("\t"); printf ("%s\n",*c); } }

Файл main.c:

#include <stdio.h>   #define N 5   int main () { char strs[N][10]; char *p[N];   int i;   for(i=0; i<N; i++) { scanf("%s", strs[i]); p[i] = &strs[i][0]; }   l2r(p, N); r2l(p, N); }

В теле функции main() заполняется массив, состоящий из строк, а также массив указателей на эти строки. Далее в функции l2r() и r2l() передаются ссылки на первый элемент массива указателей и значение символической константы N. Эти функции осуществляют вывод элементов массива строк с отступами.

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

 gcc -c superprint.c gcc -c main.c 

Тоже самое можно сделать за один вызов gcc:

 gcc -c superprint.c main.c

Или даже вот так, если в каталоге находятся только файлы текущего проекта:

 gcc -c *.c

В любом случае в каталоге появятся два объектных файла: superprint.o и main.o. Далее их можно скомпилировать в один исполняемый файл так:

 gcc -o myprint main.o superprint.o

или так:

 gcc -o myprint *.o

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

 gcc -o main.o superprint.o

Если теперь запустить файл myprint, то программа будет ожидать ввода пяти слов, после чего выведет их на экран два раза по-разному (с помощью функций l2r() и r2l()):

Задумаемся, каким образом в представленной выше программе функция main() "узнает" о существовании функций l2r() и r2l(). Ведь в исходном коде файла main.c нигде не указано, что мы подключаем файл superprint.c, содержащий эти функции. Действительно, если попытаться получить из main.c отдельный исполняемый файл, т.е. скомпилировать программу без superprint.c:

 gcc main.c

, то ничего не получиться. Компилятор сообщит об ошибке вызова неопределенных идентификаторов. Получить из файла superprint.c отдельный исполняемый файл вообще невозможно, т.к. там отсутствует функция main(). А вот получить из этих файлов отдельные объектные файлы можно. Представим, что одни объектные файлы как бы "выставляют наружу" имена определенных в них функций и глобальных переменных, а другие - вызовы этих имен из тел других функций. Дальше объектные файлы "ожидают", что имена будут связаны с их вызовами. Связывание происходит при компиляции исполняемого файла из объектных.

Создание заголовочных файлов

Продолжим разбирать приведенную выше программу. Что будет, если в функции main()осуществить неправильный вызов функций l2r() и r2l()? Например, указать неверное количество параметров. В таком случае создание объектных файлов пройдет без ошибок, и скорее всего удастся получить исполняемый файл; но вот работать программа будет неправильно. Такое возможно потому, что ничего не контролирует соответствие вызовов прототипам (объявлениям) функций.

Куда правильней сообщать о неверном вызове функций уже при получении объектного файла. Поэтому хотя можно обойтись и без этого, но очень желательно сообщать функции main()прототипы функций, которые из нее вызываются. Это можно сделать, прописав объявления функций в файле main.c:

… void l2r (char **c, int n); void r2l (char **c, int n); main () { …

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

А теперь представим, что программа у нас несколько больше и содержит десяток файлов исходного кода. Файл aa.c требует функций из файла bb.c, dd.c, ee.c. В свою очередь dd.c вызывает функции из ee.c и ff.c, а эти два последних файла активно пользуются неким файлом stars.c и одной из функций в bb.c. Программист замучится сверять, что чего вызывает откуда и куда, где и какие объявления надо прописывать. Поэтому все прототипы (объявления) функций проекта, а также совместно используемые символические константы и макросы выносят в отдельный файл, который подключают к каждому файлу исходного кода. Такие файлы называются заголовочными; с ними мы уже не раз встречались. В отличие от заголовочных файлов стандартной библиотеки, заголовочные файлы, которые относятся только к вашему проекту, при подключении к файлу исходного кода заключаются в кавычки, а не скобки. Об этом упоминалось в предыдущем уроке.

Итак, более грамотно будет не добавлять объявления функций в файл main.c, а создать заголовочный файл, например, myprint.h и поместить туда прототипы функций l2r() и r2l(). А в файле main.c следует прописать директиву препроцессора:

 #include "myprint.h" 

В принципе смысла подключать myprint.h к файлу superprint.c в данном случае нет, т.к. последний не использует никаких сторонних функций, кроме стандартной библиотеки. Но если планируется расширять программу и есть вероятность, что в файле superprint.c будут вызываться сторонние для него функции, то будет надежней сразу подключить заголовочный файл.

Обратим внимание еще на один момент. Стоит ли в описанном в этом уроке примере выносить константу N в заголовочный файл? Здесь нельзя дать однозначный ответ. Если ее туда вынести, то она станет доступна в обоих файлах, и поэтому можно изменить прототипы функций так, чтобы они принимали только один параметр (указатель), а значение N будет известно функциям их заголовочного файла. Однако стоит ли так делать? В функции r2l() второй параметр изменяется в процессе ее выполнения, что делать с константой будет невозможно. Придется переписывать тело функции. Кроме того, вдруг в последствии нам захочется использовать файл superprint.c в другом проекте, где будут свои порядки, и константы N в заголовочном файле не найдется.

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

Особенности использования глобальных переменных

Помните, если можно отказаться от использования глобальных переменных, то лучше это сделать. Желательно стремиться к тому, чтобы любой файл проекта, скажем так, "не лез к соседу за данными, а сосед не разбрасывал эти данные в виде глобальных переменных". Обмен данными между функциями должен осуществлять за счет передачи данных в качестве параметров и возврата значений с помощью оператора return. (Массивов это не касается.)

Однако в языке программирования C есть проблема. С помощью return можно вернуть только одно значение. Но могут быть случаи, когда функция должна изменить несколько переменных (здесь не имеются ввиду элементы массива). В таком случае без глобальных переменных обойтись сложно.

  • Если в файле aa.c объявлена переменная за пределами любой функции (например, так: intcount), то она является глобальной для всех файлов проекта. Чтобы получить значение этой переменной в файле aa.c достаточно просто указать ее имя (если в функции нет локальной переменной с тем же именем). Чтобы получить значение из других файлов, надо указать, что имеется в виду глобальная переменная, а не локальная. Делается это с помощью ключевого слова extern (например, extern count).
  • Бывают ситуации, когда в одном файле для нескольких содержащихся в нем функций нужна глобальная переменная. Но эта переменная не должна быть доступна функциям, содержащимся в других файлах. В таком случае глобальная переменная объявляется с ключевым словом static (например, static int count). Тем самым мы как бы скрываем глобальную переменную.

Напишите простые наглядные примеры, использования глобальных функций:

  1. Объявите глобальную переменную в одном файле, а получите ее значение в другом файле (выведите на экран).
  2. Объявите в одном файле статическую глобальную переменную. Выведите ее значение на экран из функции данного файла. Попытайтесь сделать это из функции другого файла.
  3. Создайте две глобальные переменные в одном файле. В другом файле напишите функцию, которая меняет их значение.

Курс с решением части задач:
android-приложение, pdf-версия

Что должно быть в с-файле, а что должно быть в h-файле? / Хабр

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

Отчасти это дело вкуса, поэтому, кому интересно как это делаю я, добро пожаловать под кат.

Несмотря на то, что «вся правда» о h-файлах содержится в соответствующем разделе описания препроцессора gcc, позволю себе некоторые пояснения и иллюстрации.

Итак, если дословно, заголовочный файл (h-файл) — файл содержащий Си декларации и макро определения, предназначенные для использования в нескольких исходных файлах (с-файлах). Проиллюстрируем это.

Легко заметить, что функции 1 и 2, а так же макрос 2, упомянуты в обоих файлах. И, поскольку, включение заголовочных файлов приводит к таким же результатам, как и копирование содержимого в каждый си-файл, мы можем сделать следующее:

Таким образом мы просто выделили общую часть из двух файлов и поместили ее в заголовочный файл.
Но является ли заголовочный файл интерфейсом в данном случае?

  • Если нам нужно использовать функциональность, которую реализуют функции 1 и 2 где то еще, то Да
  • Если макрос 2, предназначен только для использования в файлах Unit1.c и Unit2.c, то ему не место в интерфейсном файле

Более того, действительно ли нам необходимо иметь два си-файла для реализации интерфейса, определенного в заголовочном файле? Или достаточно одного?
Ответ на этот вопрос зависит от деталей реализации интерфейсных функций и от их места реализации. Например, если сделать диаграммы более подробными, можно представить вариант, когда интерфейсные функции реализованы в разных файлах:

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

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

Из диаграммы видно, что на самом деле мы имеем дело с двумя независимыми модулями, у каждого из которых имеется свой интерфейс в виде заголовочного файла. Это дает возможность использовать только тот интерфейс, который действительно необходим в данном конкретном случае.Более того, эти модули могут быть протестированы независимо друг от друга.
Читатель, наверное, заметил, что макрос 2 из заголовочного файла снова вернулся в виде копии в оба си-файла. Конечно, это не очень удобно поддерживать. Но и делать данный макрос частью интерфейса не правильно.
В таких случаях, я предпочитаю делать отдельный заголовочный файл содержащий типы и макросы, необходимые нескольким си-файлам.

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

Спасибо за внимание к материалу.

как создать заголовочный файл в dev c++



Я создаю заголовочный файл в первый раз в dev c++ Я создал add.h и add.cpp в соответствии с правильным форматом. Я не знаю, где их хранить, и когда я использую заголовок, он показывает много ошибок

c++ dev-c++
Поделиться Источник Unknown     28 сентября 2009 в 04:15

3 ответа


  • В том числе C++ заголовочный файл в файл c#

    Я преобразовывал управляемый проект c++ в проект C#. Проект C++ включает в себя заголовочный файл констант C++, который является внешней зависимостью, присутствующей вне проекта. Есть ли способ включить этот заголовочный файл C++ в только что созданный файл C#? Я не хочу переопределять эти...

  • Dev C++ не может поддерживать с заголовочным файлом iostream.h в C++

    Почему Dev C++ не может поддерживать заголовочный файл с iostream.h в C++..? Как включить заголовочный файл iostream.h в Dev C++?



2

Обычно мои заголовки выглядят так:

#ifndef ADD_H #define ADD_H class Add { ... }; #endif 

и я сохраняю их в том же каталоге, что и мои файлы .cpp.

В файле реализации:

#include "add.h" 

А потом в главном cpp файле:

#include "add.h" 

Поделиться Dave     28 сентября 2009 в 04:36



0

Не имеет значения, где вы их сохраняете, просто поместите их в тот же каталог.

Вы включаете заголовок в свой файл .cpp следующим образом:

#include "add.h" 

Попробуйте погуглить для некоторых начинающих C++ учебники.

Поделиться mpen     28 сентября 2009 в 04:18



0

Проблема в том, что он показывает много ошибок, заключается в том, что вы, возможно, написали неверный код. Вы можете начать новый вопрос, вставить часть кода, которая, по вашему мнению, является причиной ошибки, с небольшим описанием вашего кода, и мы с радостью поможем вам :)

Поделиться akif     28 сентября 2009 в 13:04


  • Как наследовать заголовочный файл c++?

    В java нет никакого заголовочного файла. Мы импортируем класс и используем функцию. Мы также можем расширить их. В C++ есть заголовочный файл. Мы включаем их и используем функцию. Теперь мой вопрос, как наследовать их, как java extends и возможно ли это?

  • Как создать свой собственный заголовочный файл в c++?

    Я M новый многообещающий programmer.Is это возможно для меня, чтобы создать новый файл заголовка моего собственного? Может ли кто-нибудь помочь мне, как создать свой собственный заголовочный файл в c++ с примером ?


Похожие вопросы:


C-заголовочный файл, содержащий только прототипы

Я работаю над некоторым назначением, и в основном мы знакомимся с разделением наших файлов. До сих пор мы действительно имели дело только с одним главным файлом. Итак, у меня есть три файла-main.c,...


Как создать заголовочный файл C с помощью инструмента Javah

Привет ребята я использую android ndk и для этого я пытаюсь создать c заголовочный файл с помощью инструмента javah как использовать и где использовать этот инструмент я не могу понять так что...


Как импортировать заголовочный файл C++ из статической библиотеки в Obj-C?

У меня есть сторонняя статическая библиотека, которая включает в себя заголовочный файл, написанный на C++. Я связал библиотеку, но получаю ошибки компиляции, потому что заголовочный файл uses...


В том числе C++ заголовочный файл в файл c#

Я преобразовывал управляемый проект c++ в проект C#. Проект C++ включает в себя заголовочный файл констант C++, который является внешней зависимостью, присутствующей вне проекта. Есть ли способ...


Dev C++ не может поддерживать с заголовочным файлом iostream.h в C++

Почему Dev C++ не может поддерживать заголовочный файл с iostream.h в C++..? Как включить заголовочный файл iostream.h в Dev C++?


Как наследовать заголовочный файл c++?

В java нет никакого заголовочного файла. Мы импортируем класс и используем функцию. Мы также можем расширить их. В C++ есть заголовочный файл. Мы включаем их и используем функцию. Теперь мой вопрос,...


Как создать свой собственный заголовочный файл в c++?

Я M новый многообещающий programmer.Is это возможно для меня, чтобы создать новый файл заголовка моего собственного? Может ли кто-нибудь помочь мне, как создать свой собственный заголовочный файл в...


Включить заголовочный файл C++ в Swift

У меня есть заголовочный файл C++ (с именем header.h ), который я хочу включить в свой проект Swift. Поскольку фреймворк C++, который я хочу включить, еще не завершен, у меня пока есть только...


Включить и скомпилировать заголовочный файл C++ из C

У меня есть файл C++ и его заголовочный файл. Мне нужно включить этот заголовочный файл в код C и использовать функции в нем. Когда файл cpp.h компилируется через main.c , компиляция завершается...


C заголовочный файл, включенный в другой заголовочный файл, и оба они включены в файл c

У меня есть вопрос относительно заголовочных файлов в C. Допустим , у меня есть заголовочный файл, содержащий структуру car под названием cars.h , следующим образом: typedef struct car_s { string...

файлов заголовков на C / C ++ | Создание файлов заголовков за секунды

Знаете ли вы о различных файлах заголовков в C / C ++? Если нет, не о чем беспокоиться. Мы собираемся обсудить все, что касается файлов заголовков в C / C ++. Для работы каждой программы требуется хотя бы один файл заголовка.

Прежде чем мы начнем обсуждение, важно понять, что такое директивы препроцессора? Это основные строительные блоки файлов заголовков в C и C ++. Термин « препроцессор » означает , само собой разумеющееся .Слово «pre» означает «до», а слово «обработчик» означает «что-то сделать». Перед компиляцией исходного кода он автоматически обрабатывается из-за наличия директив препроцессора.

Итак, давайте начнем и исследуем всю глубину заголовочных файлов C / C ++ , которые помогут вам во многих отношениях.

1. Что такое заголовочный файл в C и C ++?

Стандартная библиотека C / C ++ предлагает своим пользователям множество функций, одна из которых - файлы заголовков.

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

Заголовочный файл на C / C ++ содержит:

  • Определения функций
  • Определения типов данных
  • Макросы

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

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

Программа на C ++ обязательно должна содержать заголовочный файл , который обозначает поток ввода и вывода, используемый для ввода с помощью функции cin >> и отображения вывода с помощью cout < < функция .

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

В основном файлы заголовков бывают двух типов:

  1. Файлы заголовков стандартной библиотеки: Это уже существующие файлы заголовков, уже доступные в компиляторе C / C ++.
  2. Пользовательские файлы заголовков: Файлы заголовков, начинающиеся с #define, могут быть созданы пользователем.

Не забудьте проверить - Базовая структура программирования на C

2.Синтаксис файла заголовка в C / C ++

Синтаксис файла заголовка можно определить двумя способами:

Имя файла заголовка заключено в угловые скобки. Это наиболее распространенный способ определения файла заголовка. Как обсуждалось ранее, в C все файлы заголовков обязательно должны начинаться с расширения .h, в противном случае вы получите ошибку компиляции, но это не так в C ++.

Например,

#include // Поддерживается как в C, так и в C ++

And,

#include // Эксклюзивная функция C ++

  • #include "имя файла.h »или #include« filename »

Имя файла заголовка заключено в двойные кавычки. Обычно это предпочтительнее при определении определяемых пользователем файлов заголовков.

Например,

#include ”stdlib.h” // Доступно как на C, так и на C ++

And,

#inlcude ”iostream” // Исключительно для C ++

Ключевые выводы: We нельзя дважды включить один и тот же файл заголовка в одну и ту же программу.

Знаете ли вы о правилах синтаксиса в программировании на C

3.Как работают файлы заголовков?

Исходный файл содержит #include, который отвечает за указание компилятору C / C ++ того, что этот файл должен быть обработан перед компиляцией, и включает все необходимые определения типов данных и функций.

4. Как создать свой собственный файл заголовка на C / C ++?

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

Давайте разберемся, как создать свой заголовочный файл на C ++ на примере.

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

Используемые шаги:
Шаг - 1

Напишите свой собственный код на C ++ и сохраните файл с расширением .h вместо .cpp, потому что вы создаете файл заголовка, а не программу на C ++. Имя файла, который вы сохраняете с .h расширение будет именем вашего файла заголовка. Предположим, вы назвали его factorial.h .

 int факториал (целое число) { int итерация, factorial = 1; for (итерация = 1; итерация <= число; итерация ++) { факториал = факториал * итерация; } возврат факториала; } 

Код на экране -

Шаг - 2

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

#include «факториал.h ”- Заключение имени файла заголовка в двойные кавычки означает, что файл заголовка C и C ++ находится в текущей папке, с которой вы работаете. Предпочтительно включать таким образом определяемые пользователем файлы заголовков.

Необходимо проверить причины популярности C

#include - Заключение имени файла заголовка в угловые скобки означает, что файл заголовка находится в стандартной папке всех остальных заголовков файлы C / C ++.

Step - 3

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

 #include  #include "factorial.h" используя пространство имен std; int main () { cout << "Добро пожаловать в учебники DataFlair!" << endl << endl; int positive_integer; cout << "Введите положительное целое число:" << endl; cin >> positive_integer; cout << "Факториал" << положительное_ целое число << ":" << факториал (положительное_ целое число) << endl; возврат 0; } 

Код -

Выход -

Ключевой вывод: Заголовочный файл и ваша программа C / C ++ должны находиться в одной папке.

Различные типы файлов заголовков C / C ++

Вы когда-нибудь задумывались, сколько файлов заголовков существует в языке программирования C / C ++?

В C и C ++ присутствует множество файлов заголовков. Даже мы можем создать их в соответствии с нашими требованиями. Чтобы получить доступ к функциям стандартной библиотеки, некоторые файлы заголовков в C / C ++ должны быть включены до написания тела программы.

Заголовочный файл C / C ++

Давайте посмотрим на эти заголовочные файлы на C и C ++ :.

1. #include (стандартный заголовок ввода-вывода)

Используется для выполнения операций ввода и вывода в C, таких как scanf () и printf ().

2. #include (Заголовок строки)

Выполнение операций обработки строк, таких как strlen и strcpy.

3. #include (Заголовок ввода-вывода консоли)

Выполните операции ввода и вывода консоли, такие как clrscr (), чтобы очистить экран, и getch (), чтобы получить символ с клавиатуры.

4. #include (Заголовок стандартной библиотеки)

Выполняет стандартные служебные функции, такие как динамическое выделение памяти, используя такие функции, как malloc () и calloc ().

5. #include (Заголовок Math)

Выполнять математические операции, такие как sqrt () и pow (). Чтобы получить квадратный корень и степень числа соответственно.

6. #include (Заголовок символьного типа)

Выполняет функции символьного типа, такие как isaplha () и isdigit ().Чтобы определить, является ли данный символ алфавитом или цифрой соответственно.

7. #include (Заголовок времени)

Выполняет функции, связанные с датой и временем, такие как setdate () и getdate (). Чтобы изменить системную дату и соответственно получить время процессора.

8. #include (Заголовок утверждения)

Он используется в функциях утверждения программы, таких как assert (). Чтобы получить целочисленный тип данных в C / C ++ в качестве параметра, который печатает stderr, только если переданный параметр равен 0.

9. #include (Заголовок локализации)

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

10. #include (Заголовок сигнала)

Выполняет функции обработки сигналов, такие как signal () и raise (). Чтобы установить обработчик сигналов и поднять сигнал в программе соответственно

11. #include (Заголовок перехода)

Выполнение функций перехода.

12.#include (Стандартный заголовок аргумента)

Выполняет стандартные функции аргумента, такие как va_start и va_arg (). Для указания начала списка аргументов переменной длины и для выборки аргументов из списка аргументов переменной длины в программе соответственно.

13. #include (Заголовок обработки ошибок)

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

Изучите 6 типов операторов в C / C ++, чтобы улучшить свои фундаментальные навыки

Список заголовочного файла C ++

Ниже приведены некоторые файлы заголовков C ++, которые не поддерживаются в C-

  1. #inlcude < iostream> (поток ввода-вывода) - Используется как поток ввода-вывода.
  2. #include (Манипуляция вводом-выводом) - Используется для доступа к set () и setprecision ().
  3. #include (Файловый поток) - Используется для управления данными для чтения из файла в качестве ввода и данных для записи в файл в качестве вывода.

Резюме

Программист C / C ++ должен быть хорошо знаком с использованием файлов заголовков. В этом руководстве мы узнали о различных файлах заголовков, доступных в C / C ++, о том, как они определены, как они работают и как создать определяемый пользователем файл заголовка. Мы закончили обсуждение, суммируя функции различных типов файлов заголовков.

Макросы в программировании на C - не считайте это устаревшей функцией

Не забудьте поделиться своими драгоценными отзывами.Прокомментируйте, если у вас есть вопросы.

.

c ++ - Как создать файл заголовка

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
.

Как создать заголовочный файл для моей существующей программы C в Linux для подключения к MySql?

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
.

Как объявить канал в файле заголовка? (В C)

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
.

новых вопросов о файлах заголовков - qaru Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
.

Смотрите также