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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
09.01.2012, 05:29     Заголовочные файлы #1
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++ заголовочные файлы в с++
C++ Заголовочные файлы
g++ Заголовочные файлы C++
C++ Заголовочные файлы
C++ Заголовочные файлы
C++ Заголовочные файлы
Заголовочные файлы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9384 / 5434 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
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
1478 / 1054 / 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,131
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
Эксперт С++Автор FAQ
 Аватар для Evg
16946 / 5351 / 329
Регистрация: 30.03.2009
Сообщений: 14,389
Записей в блоге: 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
Фрилансер
Эксперт C++
 Аватар для Dekio
5817 / 1215 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
09.01.2012, 17:00     Заголовочные файлы #8
Как альтернативу можно использовать нестандартную но широко используемую защиту
#pragma once
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16946 / 5351 / 329
Регистрация: 30.03.2009
Сообщений: 14,389
Записей в блоге: 26
09.01.2012, 17:05     Заголовочные файлы #9
Tamoren, ты задаёшь много интересных вопросов, потому что учишься. Но не на все вопросы ты сможешь понять правильный ответ. Есть такая хорошая практика - сначала тупо научиться делать, как делают другие, а со временем уже начать разбираться, почему нужно делать именно так.

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

Цитата Сообщение от Tamoren Посмотреть сообщение
Что это за файлы с символами "~" и "$"? Какой-то лог?
Это лог запуска из линуксовой консоли
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9384 / 5434 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
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?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 21:52     Заголовочные файлы
Еще ссылки по теме:

Заголовочные файлы (.h) C++
заголовочные файлы C++
C++ Заголовочные файлы
C++ Заголовочные файлы
C++ Заголовочные файлы - C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16946 / 5351 / 329
Регистрация: 30.03.2009
Сообщений: 14,389
Записей в блоге: 26
09.01.2012, 21:52     Заголовочные файлы #12
Цитата Сообщение от Tamoren Посмотреть сообщение
Ну с Вашей позици я бы назвал их тупыми
Дело не в том, что вопросы тупые, а в том, что их много и ты всё пытаешься понять чисто в теории. Почему в первом классе не учат интегралы? Потому что для этого надо слишком много знать. Вот и ты для начала научись примитивным и простым вещам, а потом уже лезь в сложные. А то у тебя будут одни теоретические знания, которые ты даже на практике применить не сможешь. Твои два последние вопроса ровно об этом и говорят. Если ты прочёл статью про препроцессор, но сам не можешь ответить на свои вопросы, значит эти теоретические знания тебе никакую пользу не принесли, потому что обладая ими ты не можешь ответить на вопросы, которые напрямую из этого вытекают
Yandex
Объявления
09.01.2012, 21:52     Заголовочные файлы
Ответ Создать тему
Опции темы

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