Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свой includ, Как можно научится писать includs ? 
:(
    Опции темы
mur88
Дата 11.11.2007, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 10.11.2007

Репутация: нет
Всего: нет



Хотел бы добавить в программу свой инклуд в котором будут реализованы часто используемые мною функции 
Возможно ли это сделать зная только сам язык программирования (В pascale это было возможно а в с++ не знаю) ???
Если да то с чего начинать ???
Если нет то почему ???

PM MAIL   Вверх
archimed7592
Дата 11.11.2007, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(mur88 @  11.11.2007,  01:45 Найти цитируемый пост)
Возможно ли это сделать зная только сам язык программирования

Да.


Цитата(mur88 @  11.11.2007,  01:45 Найти цитируемый пост)
Если да то с чего начинать ???

С чтения любой книги по языку программирования по С++.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 11.11.2007, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



myfile.h:
Код
#ifndef MYFILE_H
//запрет второго подключения
# define MYFILE_H

int my_func1(int x);
int my_func2(int y);

#endif //MYFILE_H
myfile.c
Код
#include "myfile.h"
int my_func1(int x)
{
        .....
}
int my_func2(int y)
{
        .....
}
Но книжку все-таки стоит почитать.
PM   Вверх
Dims
Дата 11.11.2007, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Это не тоже самое, что в Паскале. В Си++ #include -- это директива так называемого препроцессора. Она просто вставляет текст указанного файла так, словно вы его сами туда впечатали. И делает это ПЕРЕД компиляцией.

В языке Си++ различаются "описания" и "определения". Описание -- это просто (грубо говоря) указание типов. А определение -- это код программы.

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

Это с виду похоже на Паскаль, но по сути другое. Для работы иметь h-файл недостаточно. Нужен ещё откомпилированный файл (lib или obj) (или неоткомпилировнный cpp), в которых содержится код. Этот файл должен просто лежать в папке с библиотеками или в папке с текущим проектом и явно из программы не вызывается.

Допустим, если ты напишешь свои функции, то в h-файле ты поместишь просто её описание (прототип), то есть, информацию о том, как функция называется и какие параметры она принимает и какой тип возвращает.  Сам код функции тебе надо поместить в отдельный cpp файл и откомпилировать (получить obj). h-файл положить надо в папку включений, а obj-файл в папку библиотек. Если поставлять кому-то, то оба файла.
PM MAIL   Вверх
JackYF
Дата 11.11.2007, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Dims @  11.11.2007,  23:35 Найти цитируемый пост)
По правилам Си++ описаний одного и того же может в программе быть сколько угодно.

Нет. Только одно описание.

Цитата(Dims @  11.11.2007,  23:35 Найти цитируемый пост)
И поэтому, инклюды можно повторять

Не поэтому. Потому что есть стражи включения.


А так верно описал.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 12.11.2007, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(JackYF @  11.11.2007,  23:57 Найти цитируемый пост)
Нет. Только одно описание.

у вас просто разное понимание терминов
я думаю, под описанием Dims имел в виду объявление (потому что определение у него тоже фигурирует)

Добавлено @ 10:12
Цитата(Dims @  11.11.2007,  23:35 Найти цитируемый пост)
Но кода (самого текста функций) там нет, так как по правилам Си++ код повторять нельзя.

не совсем верно
код в include-файлах может быть (и сей факт довольно часто используется)
важно, чтобы все функции / переменные, определенные в нем были или inline (С или С++) (только для функций), или статическими (С), или принадлежали анонимному namespace ' у (С++), иными словами имели локальную в пределах модуля область видимости

Это сообщение отредактировал(а) MAKCim - 12.11.2007, 10:16


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 12.11.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(MAKCim @  12.11.2007,  10:05 Найти цитируемый пост)
у вас просто разное понимание терминов

Термина "описание" в С++ вроде вообще нет smile. Есть declaration и definition.

Добавлено через 32 секунды
И есть one definition rule(ODR), но нету one declaration rule smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 12.11.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(archimed7592 @  12.11.2007,  10:14 Найти цитируемый пост)
Термина "описание" в С++ вроде вообще нет smile. Есть declaration и definition. 

ну я и говорю, разное понимание (aka перевод) терминов  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Lazin
Дата 12.11.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(MAKCim @  12.11.2007,  10:05 Найти цитируемый пост)
важно, чтобы все функции / переменные, определенные в нем были или inline (С или С++) (только для функций), или статическими (С), или принадлежали анонимному namespace ' у (С++), иными словами имели локальную в пределах модуля область видимости

Вобще в инклудах можно тупо писать код, если в классе, который описан в h файле реализован метод то он становится inline автоматически
Код

class C
{
 C(){......}
 void Method {.....}
};

вобще я много раз видел как код писали вот так-вот, самый главный минус - тормозная компиляция(прекомпиляция вообще не возможна), помимо, компилятор ругается на то-что многие ф-ии - реализованные в объявлении класса он не может сделать их inline (если в функции есть цикл, или статические переменные).
Другое дело шаблоны. Шаблонные классы надо писать целиком в заголовочных файлах, иначе будут проблемы с компоновкой. 
PM MAIL Skype GTalk   Вверх
MAKCim
Дата 12.11.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Lazin @  12.11.2007,  11:14 Найти цитируемый пост)
если в классе, который описан в h файле реализован метод то он становится inline автоматически

не помню, в стандарте такое поведение описано?
компилятор может их заинлайнить, но он не обязан этого делать (и не делает в GCC (без оптимизации по дефолту)) и уж тем более "ругаться"


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 12.11.2007, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(MAKCim @  12.11.2007,  11:44 Найти цитируемый пост)
е помню, в стандарте такое поведение описано?

Описано, что ф-ции становятся inline, но нигде не написано, что inline-ф-ции обязаны встраиваться - это уже как компилятор решит.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 12.11.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(archimed7592 @  12.11.2007,  11:53 Найти цитируемый пост)
Описано, что ф-ции становятся inline, но нигде не написано, что inline-ф-ции обязаны встраиваться - это уже как компилятор решит. 

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Dims
Дата 12.11.2007, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Да, всё правильно, под "описанием" я имел в виду declaration.


Цитата

код в include-файлах может быть (и сей факт довольно часто используется)
важно, чтобы все функции / переменные, определенные в нем были или inline (С или С++) (только для функций), или статическими (С), или принадлежали анонимному namespace ' у (С++), иными словами имели локальную в пределах модуля область видимости


Да, согласен с поправкой про inline. Что было со статическими в Си не помню, а вот переменные из безымянного пространства, что-то не согласен.

Вот такой код 

Код

int a;
int a;

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}


Вызвал у меня ошибку: 

Error    1    error C2086: 'int a' : redefinition    d:\users\dims\design\visualstudio\tests\tests\tests.cpp    9    

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

А вот такой код

Код


extern int a;
extern int a;
extern int a;
extern int a;
int a;

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}



откомпилировался нормально.
PM MAIL   Вверх
archimed7592
Дата 12.11.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(MAKCim @  12.11.2007,  12:02 Найти цитируемый пост)
несколько странно, не кажется?  smile 

Нет не кажется. Есть ф-ции, заинлайнить которые невозможно.

Цитата(MAKCim @  12.11.2007,  12:02 Найти цитируемый пост)
я это к тому, что зачем вводить дополнительный пункт в стандарт, если в определении методов можно напрямую указывать inline
некоторая избыточность получается

Насколько я понимаю, для современных компиляторов это подсказка, которая отключает у него часть эвристики, решающей делать ли ф-цию inline(т.е., к примеру решение будет приниматься исключительно исходя из размера ф-ции[если, конечно, её вообще заинлайнить возможно]), или увеличивает вероятность, что эвристика примет решение заинлайнить ф-ции(опять же, если это вообще возможно).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 12.11.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(archimed7592 @  12.11.2007,  21:23 Найти цитируемый пост)
Насколько я понимаю, для современных компиляторов это подсказка, которая отключает у него часть эвристики, решающей делать ли ф-цию inline(т.е., к примеру решение будет приниматься исключительно исходя из размера ф-ции[если, конечно, её вообще заинлайнить возможно]), или увеличивает вероятность, что эвристика примет решение заинлайнить ф-ции(опять же, если это вообще возможно). 

и я о том же
зачем у компилятора отнимать его хлеб?  smile 
Цитата(archimed7592 @  12.11.2007,  21:23 Найти цитируемый пост)
Нет не кажется. Есть ф-ции, заинлайнить которые невозможно.

inline же не обязывает обязательно использовать встраивание
лишь рекомендует

Добавлено через 2 минуты и 37 секунд
Dims, 
при чем тут твой код и анонимные пространства имен?
двойное определение даже статических (или в анонимном пространстве имен) глобальных переменных в одном модуле не допускается


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1945 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.