Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2009, 22:59   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию раздельная компилляция

сейчас я учусь делать раздельную компилляцию программы. разбиваю её на несколько файлов и по-отдельности компиллирую. у меня вопрос:
что делает #infdef, #endif и как он полностью расшифровывается
и что делает #define
Dimarik вне форума Ответить с цитированием
Старый 15.05.2009, 23:04   #2
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Код:
#ifndef prototip
#define prototip
struct stoit
{
string city;
string kod;
float price;
float min;
float cost;
}   ;
        vvod( short n,stoit gorod[] );          //прототип функции ввода
        rass(short n, stoit gorod[]);           //прототип функции рассчёта
        vivod (short n, stoit gorod[]);         //прототип функции вывода
#endif
Dimarik вне форума Ответить с цитированием
Старый 15.05.2009, 23:32   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
что делает #infdef, #endif и как он полностью расшифровывается
и что делает #define
Код:
#ifndef prototip
.................
#endif
Если НЕ определена константа prototip, то будет скомпилирован код, заключенный в ifndef-endif
Код:
#define prototip
Определяем константу (можно сказать, макрос) protorip

Все вместе звучит так:
Если не определена константа protorip, значит этот файл еще не был подключен. Значит этот код нужно скомпилировать. Но чтобы избежать повторного включения, определим эту самую константу protorip.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 15.05.2009, 23:42   #4
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

создал ещё 2 файла, но они почему-то по-отдельности не компиллируются.. выдаёт ошибку на месте #include "prototip.h"
Код:
//city1.cpp - часть программы (её главня функция main
#include <iostream.h>
        #include <windows.h>
        char bufRus[256];
        char*Rus(const char*text)
        {
        CharToOem(text, bufRus);
        cout<<bufRus;
        return bufRus;
        }     ;
#include "prototip.h"
main()
{
short n;
Rus("Введите число городов, в которые вы звонили:\n");
cin>>n;
stoit * gorod=new stoit[n];
vvod(n,gorod);
rass(n,gorod);
vivod(n,gorod);
system ("pause");
}

и вот 2я часть проги
Код:
#include <iostream.h>
#include <string.h>
#include "prototip.h"



        vvod( short n,stoit gorod[] )//функция ввода
{
for (short i=0; i<n;i++)
{
Rus("Введите название города, его код, стоипость одной минуты,количество проговорённых минут:\n");
cin>>gorod[i].city;
cin>>gorod[i].kod;
cin>>gorod[i].price;
cin>>gorod[i].min;
}
}
        rass(short n, stoit gorod[])//функция раасчёта
{
for(short i=0; i<n; i++)
        {
        gorod[i].cost=gorod[i].price*gorod[i].min;
        }
}
        vivod(short n, stoit gorod[])//вывод
{
int x;
Rus("Назв. города      Код               Стоим. мин.    Кол-во мин.    Итог\n");
const short m=18;
for (int i=0;i<n;i++) //большой цикл
{x=gorod[i].city.size();   // определяет число символов перемнной string
cout<<gorod[i].city;
        for (int j=0;j<(m-x);j++)
        {
        cout<<" ";
        }
x=gorod[i].kod.size();
cout<<gorod[i].kod;
        for (int h=0;h<(m-x);h++)
        {cout<<" ";} ;
      string  fa ;
fa=FloatToStrF(gorod[i].price, ffFixed,3,2).c_str();//ошибка!!!!
x=fa.size();
cout<<gorod[i].price;
        for (int k=0;k<(m-x);k++)
        {cout<<" ";}
fa=FloatToStrF(gorod[i].min, ffFixed,3,2).c_str();    //переводит переменную float в переменую ansistring
//и затем в переменную string
x=fa.size();
cout<<gorod[i].min;
        for (int l=0;l<(m-x);l++)
        {cout<<" ";}
fa=FloatToStrF(gorod[i].cost, ffFixed,3,2).c_str();
x=fa.size();
cout<<gorod[i].cost;
        for (int lo=0;lo<(m-x);lo++)
        {cout<<" ";}
cout<<endl;
};
}
Dimarik вне форума Ответить с цитированием
Старый 15.05.2009, 23:45   #5
vasek123
Заблокирован
 
Регистрация: 21.11.2008
Сообщений: 4,986
Сообщение

Директива #define имеет возможность добавления константы(в С не было возможности обьявления констант ключевым словом const), проще говоря, определяет макроимя.

С помощью #endif- завершает блок условной компиляции.

#ifndef- это модификация условия компиляции когда макроимя не определено(#ifdef- когда макроимя определено).

Все диррективы препроцессора начинаются с #(в том числе и #if).

p.s. Как можно изучать раздельное компилирование, не зная для чего предназначенны эти диррективы? Читаем книжки- там все подробно описанно...
vasek123 вне форума Ответить с цитированием
Старый 15.05.2009, 23:47   #6
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

и паралленльно один вопрос.. каком образом компиллятор находит тот файл, в котором содержатся прототипы???
ведь мы просто пишем #include "prototip.h" и не указываем путь к нужному файлу.. ведь компиллятор же не будет по всему жёсткому искать этот файл?? каким образом тогода он его находит?
Dimarik вне форума Ответить с цитированием
Старый 15.05.2009, 23:52   #7
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от vasek123 Посмотреть сообщение
Директива #define имеет возможность добавления константы(в С не было возможности обьявления констант ключевым словом const), проще говоря, определяет макроимя.
Вы противоречите сами себе. Определяет макрос и добавляет константу - разные вещи. Директива #define - именно создает макрос, но не создает константную переменную (не выделяет память). Модификатор const, который, кстати всегда был в Си, делает из объявления переменной константу (т.е. запрещает изменение переменной после объявления)
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 15.05.2009, 23:55   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
и паралленльно один вопрос.. каком образом компиллятор находит тот файл, в котором содержатся прототипы???
Если пишете в кавычках, то ищет в папке с проектом.

Цитата:
создал ещё 2 файла, но они почему-то по-отдельности не компиллируются.. выдаёт ошибку на месте #include "prototip.h"
Что за ошибка? Приведите текст.
И что значит "вторая часть проги"? Программа в одном файле?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 15.05.2009, 23:56   #9
vasek123
Заблокирован
 
Регистрация: 21.11.2008
Сообщений: 4,986
Сообщение

Цитата:
Сообщение от Dimarik Посмотреть сообщение
и паралленльно один вопрос.. каком образом компиллятор находит тот файл, в котором содержатся прототипы???
ведь мы просто пишем #include "prototip.h" и не указываем путь к нужному файлу.. ведь компиллятор же не будет по всему жёсткому искать этот файл?? каким образом тогода он его находит?
Когда задаешь диррективу препроцессору с помощью " " или < >- ты помимо всего указываешь в каком месте надо искать данный файл.
например:
Код:
#include "prototip.h"
Цитата:
Сообщение от Blade Посмотреть сообщение
Вы противоречите сами себе. Определяет макрос и добавляет константу - разные вещи. Директива #define - именно создает макрос, но не создает константную переменную (не выделяет память). Модификатор const, который, кстати всегда был в Си, делает из объявления переменной константу (т.е. запрещает изменение переменной после объявления)
Не совсем, смотря где и как обьявлять...

p.s. Мы учебник хоть раз брали в руки?

Последний раз редактировалось vasek123; 16.05.2009 в 00:21.
vasek123 вне форума Ответить с цитированием
Старый 15.05.2009, 23:56   #10
vasek123
Заблокирован
 
Регистрация: 21.11.2008
Сообщений: 4,986
Сообщение

Цитата:
Сообщение от Dimarik Посмотреть сообщение
и паралленльно один вопрос.. каком образом компиллятор находит тот файл, в котором содержатся прототипы???ведь мы просто пишем #include "prototip.h" и не указываем путь к нужному файлу.. ведь компиллятор же не будет по всему жёсткому искать этот файл?? каким образом тогода он его находит?
Когда задаешь диррективу препроцессору с помощью " " или < >- ты помимо всего, указываешь в каком месте надо искать данный файл. например:
Код:
#include "prototip.h"
p.s. Мы учебник хоть раз брали в руки?

Модератору: удалите лишнее сообщение, случайно создал

Последний раз редактировалось vasek123; 16.05.2009 в 01:43.
vasek123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++. Наследование. Раздельная компиляция Matthew Помощь студентам 0 08.05.2009 21:03