Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37

Заголовочные файлы

09.01.2012, 05:29. Показов 2663. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
#ifndef _MYCLASS_H
    #define _MYCLASS_H class myclass{//Описание класса};
#endif
Сказано, что заголовочные файлы обычно включают специальные константы (sentry), которые сообщают компилятору, что файл уже обработан и повторное включение не требуется.
Поправьте если не так, если _MYCLASS_H было определено как "class myclass{//Описание класса};", как в примере, то в тексте программы _MYCLASS_H заменяется на "class myclass{//Описание класса};" (без кавычек). И ещё, если _MYCLASS_H - макроимя, то не следует ли объявление класса заключить в круглые скобки?

И почему обычный код нельзя размещать в заголовочных файлах, а коды подставляемых функций можно?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.01.2012, 05:29
Ответы с готовыми решениями:

Заголовочные файлы .h, файлы исходного когда c/c++ и установление связи между ними
Всем добрый вечер!) Относительно недавно стал изучать c/c++, хочу полюбопытствовать ,так как появился вопрос. Почему при объявлении...

Работа в Visual Studio 2015 - как добавить файлы исходного кода и заголовочные файлы?
Приветствую всех! Столкнулся с тем, что решая задачи по книге Лафоре про графику, не смог добавить файлы .h и .cpp, скачав их с одной из...

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

11
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
09.01.2012, 05:40
Цитата Сообщение от Tamoren Посмотреть сообщение
И почему обычный код нельзя размещать в заголовочных файлах, а коды подставляемых функций можно?
Что есть "обычный код"?

hdrfunc.h
C
1
2
3
4
5
6
7
8
9
10
11
#ifndef _HDRFUNC_H_
#define _HDRFUNC_H_ 1
 
#include <stdio.h>
 
void hello(unsigned cnt){
    while ( cnt-- )
        printf("Hello, world!\n");
}
 
#endif
hdrfunc.c
C
1
2
3
4
5
6
#include "hdrfunc.h"
 
int main(void){
    hello(3);
    return 0;
}
Code
1
2
3
4
5
6
~/cpp/other $ gcc -o hdrfunc hdrfunc.c
~/cpp/other $ ./hdrfunc 
Hello, world!
Hello, world!
Hello, world!
~/cpp/other $
1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
09.01.2012, 05:44
вы неверно поняли этот момент.
пишется обычно вот так
C++
1
2
3
4
#ifndef _MYCLASS_H
#define _MYCLASS_H
class myclass{//Описание класса};
#endif
_MYCLASS_H ни во что нигде не разворачивается. эта штука еще називается "страж вклучения"
http://ru.wikipedia.org/wiki/Include_guard
это защита от двойного определения класса. Необходима из-за "правила одного определения", оно же One Definition Rule (ODR)
http://en.wikipedia.org/wiki/One_Definition_Rule
2
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
09.01.2012, 05:59
Цитата Сообщение от DU Посмотреть сообщение
это защита от двойного определения класса. Необходима из-за "правила одного определения", оно же One Definition Rule (ODR)
http://en.wikipedia.org/wiki/One_Definition_Rule
Я тут темку создал не давно на эту тему. Не всегда эта защита спасает.
Как влияет inline и обертка(#ifndef #define #endif) .h файла на компоновщик.
1
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
09.01.2012, 06:48  [ТС]
Цитата Сообщение от easybudda Посмотреть сообщение
Что есть "обычный код"?
Имелось ввиду НЕ коды подставляемых функций

Цитата Сообщение от easybudda Посмотреть сообщение
~/cpp/other $ gcc -o hdrfunc hdrfunc.c ~/cpp/other $ ./hdrfunc Hello, world! Hello, world! Hello, world! ~/cpp/other $
Это вроде результатов?)

Цитата Сообщение от DU Посмотреть сообщение
вы неверно поняли этот момент.
Написал с отступом по аналогии с IF, да и нагляднее так. Но раз так принято, буду так писать... Кстати, спасибо за ссылки, даже не знал как такое искать

Цитата Сообщение от easybudda Посмотреть сообщение
#define _HDRFUNC_H_ 1
Это значит, что мы инициализируем переменную (или макроимя?) значением 1? И почему вообще _HDRFUNC_H_? Что тогда в 1 примере означало это: #define _MYCLASS_H class myclass{//Описание класса};
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.01.2012, 12:28
Вот тут пример посмотри
Си, использование вложенных файлов *.c
1
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
09.01.2012, 16:55  [ТС]
Что это за файлы с символами "~" и "$"? Какой-то лог?

Цитата Сообщение от Evg Посмотреть сообщение
Вот тут пример посмотри
Посмотрел. Остались вопросы
1) _HDRFUNC_H_ это макроопределение, которое мы сами можем задать (любым), правильно?
2) Для чего нужна единица в
#define _HDRFUNC_H_ 1
? Мы определяем еденицу (?!) только один раз?
3) Получается, что
#define _MYCLASS_H class myclass{//Описание класса};
означает, что если _MYCLASS_H не было определено, мы его объявляем и далее объявляем класс, который и отстанется при компиляции??
4) А что если класс уже был определен в другом файле без _MYCLASS_H? Как текущий файл узнает, что нужно использовать _MYCLASS_H?
0
Фрилансер
Эксперт С++
 Аватар для Dekio
5845 / 1226 / 499
Регистрация: 23.11.2010
Сообщений: 3,375
Записей в блоге: 1
09.01.2012, 17:00
Как альтернативу можно использовать нестандартную но широко используемую защиту
#pragma once
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.01.2012, 17:05
Tamoren, ты задаёшь много интересных вопросов, потому что учишься. Но не на все вопросы ты сможешь понять правильный ответ. Есть такая хорошая практика - сначала тупо научиться делать, как делают другие, а со временем уже начать разбираться, почему нужно делать именно так.

Но если тебе не впадлу читать много букв и твоя голова способна вместить много информации за раз, не перемешав всё в кашу, почитай статью: Препроцессорные директивы в C/C++ (#include, #define и прочее)

Цитата Сообщение от Tamoren Посмотреть сообщение
Что это за файлы с символами "~" и "$"? Какой-то лог?
Это лог запуска из линуксовой консоли
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
09.01.2012, 17:17
Цитата Сообщение от Tamoren Посмотреть сообщение
Для чего нужна единица в
#define _HDRFUNC_H_ 1
Просто стиль такой, уберите единицу, будет работать с таким же успехом. Так идеологически правильнее.

Цитата Сообщение от Tamoren Посмотреть сообщение
#define _MYCLASS_H class myclass{//Описание класса};
А вот это, извините, ересь...
0
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
09.01.2012, 17:52  [ТС]
Цитата Сообщение от Dekio Посмотреть сообщение
#pragma once
Уйти от проблемы - не решить её. Уже прочитал немного про макрозащиту, где предлагалось альтернативой #pragma once. Но мы не ищем легких путей

Цитата Сообщение от Evg Посмотреть сообщение
если тебе не впадлу читать много букв
не впадлу буду читать. спасибо)
Цитата Сообщение от Evg Посмотреть сообщение
ты задаёшь много интересных вопросов
Ну с Вашей позици я бы назвал их тупыми Есть какое-то ощущение, что это основы основ
Цитата Сообщение от easybudda Посмотреть сообщение
Просто стиль такой, уберите единицу, будет работать с таким же успехом. Так идеологически правильнее.
Цитата Сообщение от easybudda Посмотреть сообщение
А вот это, извините, ересь...
Да-да, прочитал, понял

Осталось только это (последнее, больше не буду xD):
1) Почему принято в заголовочных файлах размещать коды только подставляемых функций?
2) А что если класс уже был определен в другом файле без _MYCLASS_H? Как текущий файл узнает, что нужно использовать _MYCLASS_H?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.01.2012, 21:52
Цитата Сообщение от Tamoren Посмотреть сообщение
Ну с Вашей позици я бы назвал их тупыми
Дело не в том, что вопросы тупые, а в том, что их много и ты всё пытаешься понять чисто в теории. Почему в первом классе не учат интегралы? Потому что для этого надо слишком много знать. Вот и ты для начала научись примитивным и простым вещам, а потом уже лезь в сложные. А то у тебя будут одни теоретические знания, которые ты даже на практике применить не сможешь. Твои два последние вопроса ровно об этом и говорят. Если ты прочёл статью про препроцессор, но сам не можешь ответить на свои вопросы, значит эти теоретические знания тебе никакую пользу не принесли, потому что обладая ими ты не можешь ответить на вопросы, которые напрямую из этого вытекают
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.01.2012, 21:52
Помогаю со студенческими работами здесь

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

заголовочные файлы
За мое небольшое время знакомство с программированием в с++ накопилось немного вопросов с работой заголовочных файлов: 1 Почему в имени...

g++ Заголовочные файлы
Значит есть у меня файлик main.cpp к нему инклудиться #include &quot;Event.h&quot; .В этом хидере название функции void event_loop(); .Так же этот...

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

Заголовочные файлы
Добрый день. Вот такой вопрос. Пишу на Борланде. Не пойму как писать, если классы помещать в свои файлы. Вот например,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru