Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
#1

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

09.01.2012, 05:29. Просмотров 1829. Ответов 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 - макроимя, то не следует ли объявление класса заключить в круглые скобки?

И почему обычный код нельзя размещать в заголовочных файлах, а коды подставляемых функций можно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2012, 05:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Заголовочные файлы (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9532 / 5525 / 932
Регистрация: 25.07.2009
Сообщений: 10,611
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 $
DU
1483 / 1059 / 45
Регистрация: 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
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
09.01.2012, 05:59 #4
Цитата Сообщение от DU Посмотреть сообщение
это защита от двойного определения класса. Необходима из-за "правила одного определения", оно же One Definition Rule (ODR)
http://en.wikipedia.org/wiki/One_Definition_Rule
Я тут темку создал не давно на эту тему. Не всегда эта защита спасает.
Как влияет inline и обертка(#ifndef #define #endif) .h файла на компоновщик.
Tamoren
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{//Описание класса};
Evg
Эксперт CАвтор FAQ
17640 / 5864 / 379
Регистрация: 30.03.2009
Сообщений: 16,168
Записей в блоге: 26
09.01.2012, 12:28 #6
Вот тут пример посмотри
Си, использование вложенных файлов *.c
Tamoren
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?
Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
09.01.2012, 17:00 #8
Как альтернативу можно использовать нестандартную но широко используемую защиту
#pragma once
Evg
Эксперт CАвтор FAQ
17640 / 5864 / 379
Регистрация: 30.03.2009
Сообщений: 16,168
Записей в блоге: 26
09.01.2012, 17:05 #9
Tamoren, ты задаёшь много интересных вопросов, потому что учишься. Но не на все вопросы ты сможешь понять правильный ответ. Есть такая хорошая практика - сначала тупо научиться делать, как делают другие, а со временем уже начать разбираться, почему нужно делать именно так.

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

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

Цитата Сообщение от Tamoren Посмотреть сообщение
#define _MYCLASS_H class myclass{//Описание класса};
А вот это, извините, ересь...
Tamoren
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?
Evg
Эксперт CАвтор FAQ
17640 / 5864 / 379
Регистрация: 30.03.2009
Сообщений: 16,168
Записей в блоге: 26
09.01.2012, 21:52 #12
Цитата Сообщение от Tamoren Посмотреть сообщение
Ну с Вашей позици я бы назвал их тупыми
Дело не в том, что вопросы тупые, а в том, что их много и ты всё пытаешься понять чисто в теории. Почему в первом классе не учат интегралы? Потому что для этого надо слишком много знать. Вот и ты для начала научись примитивным и простым вещам, а потом уже лезь в сложные. А то у тебя будут одни теоретические знания, которые ты даже на практике применить не сможешь. Твои два последние вопроса ровно об этом и говорят. Если ты прочёл статью про препроцессор, но сам не можешь ответить на свои вопросы, значит эти теоретические знания тебе никакую пользу не принесли, потому что обладая ими ты не можешь ответить на вопросы, которые напрямую из этого вытекают
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 21:52
Привет! Вот еще темы с ответами:

Заголовочные файлы - C++
Здравствуйте ув. Пользователи, У меня такой вопрос: Есть ли хорошие книги по заголовочным файла как правильно ими пользоваться... Просто...

Заголовочные файлы - C++
Подключил два заголовочных файла, при компиляции пишет, что не знает имени функции Header.h #pragma once float F1(float* ar1,...

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

Заголовочные файлы *.h - C++
Доброго времени суток! Как понят следующее: В заголовочных файлах, в целях более быстрой компиляции, для указателей на типы данных...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.01.2012, 21:52
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru