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

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2012, 05:29
Ответы с готовыми решениями:

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

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

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

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

11
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12831 / 7568 / 1764
Регистрация: 25.07.2009
Сообщений: 13,960
09.01.2012, 05:40 2
Цитата Сообщение от 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;
}
Код
~/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 3
вы неверно поняли этот момент.
пишется обычно вот так
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 4
Цитата Сообщение от 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  [ТС] 5
Цитата Сообщение от 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
21280 / 8304 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.01.2012, 12:28 6
Вот тут пример посмотри
Си, использование вложенных файлов *.c
1
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
09.01.2012, 16:55  [ТС] 7
Что это за файлы с символами "~" и "$"? Какой-то лог?

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

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

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

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

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

Осталось только это (последнее, больше не буду xD):
1) Почему принято в заголовочных файлах размещать коды только подставляемых функций?
2) А что если класс уже был определен в другом файле без _MYCLASS_H? Как текущий файл узнает, что нужно использовать _MYCLASS_H?
0
Evg
Эксперт CАвтор FAQ
21280 / 8304 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.01.2012, 21:52 12
Цитата Сообщение от Tamoren Посмотреть сообщение
Ну с Вашей позици я бы назвал их тупыми
Дело не в том, что вопросы тупые, а в том, что их много и ты всё пытаешься понять чисто в теории. Почему в первом классе не учат интегралы? Потому что для этого надо слишком много знать. Вот и ты для начала научись примитивным и простым вещам, а потом уже лезь в сложные. А то у тебя будут одни теоретические знания, которые ты даже на практике применить не сможешь. Твои два последние вопроса ровно об этом и говорят. Если ты прочёл статью про препроцессор, но сам не можешь ответить на свои вопросы, значит эти теоретические знания тебе никакую пользу не принесли, потому что обладая ими ты не можешь ответить на вопросы, которые напрямую из этого вытекают
1
09.01.2012, 21:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2012, 21:52
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru