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

Какую ide лучше использовать для c++ - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Убрать консоль при запуске программы http://www.cyberforum.ru/cpp-beginners/thread1234832.html
как сделать так чтобы при запуске программы на c++ не открывалась консоль?
C++ Существуют ли библиотеки UPnP есть-ли библиотеки для открытия портов(UPnP) на c++? http://www.cyberforum.ru/cpp-beginners/thread1234831.html
Можно ли в С++ встраивать код на Assembler C++
можно ли встроить в c++ программу код на ассемблере(masm32) если да то как?
C++ Обработчик нажатий кнопки
как в c++ создать обработчик нажатий кнопки?
C++ Перевести код с Java на C++ http://www.cyberforum.ru/cpp-beginners/thread1234822.html
как на c++ будет выглядеть код который на java выглядит так: public static ing f = 0; public static void main(String args) { dddr(4); System.out.print(f); } pulic static void dddr(int g) {
C++ Как выполнить команду cmd как на c++ выполнить команду cmd? подробнее

Показать сообщение отдельно
gru74ik
Модератор
 Аватар для gru74ik
3068 / 1313 / 164
Регистрация: 20.02.2013
Сообщений: 3,743
Записей в блоге: 15
27.07.2014, 18:58     Какую ide лучше использовать для c++
Цитата Сообщение от CyberSolver Посмотреть сообщение
что такое Makefile и раздельная компиляция уже не объяснить никогда
Опять же спорно. Читаешь книжку, всё пошагово выполняешь:
Кликните здесь для просмотра всего текста

Раздельная компиляция
Язык C++, как и С, позволяет и даже поощряет размещение функций программы в
отдельных файлах. Как говорилось в главе 1, файлы можно компилировать раздельно,
а затем связывать их с конечным продуктом — исполняемой программой. (Как прави*
ло, компилятор C++ не только компилирует программы, но и управляет работой ком*
поновщика.) При изменении только одного файла можно перекомпилировать лишь
этот файл и затем связать его с ранее скомпилированными версиями других файлов.
Этот механизм облегчает работу с крупными программами. Более того, большинство
сред программирования на C++ предоставляют дополнительные средства, упрощаю*
щие такое управление. Например, в системах Unix и Linux имеется программа make,
хранящая сведения обо всех файлах, от которых зависит программа, и о времени их
последней модификации. После запуска make обнаруживает изменения в исходных
файлах с момента последней компиляции, а затем предлагает выполнить соответ*
ствующие действия, необходимые для воссоздания программы. Большинство интег*
рированных сред разработки (integrated development environment — IDE), включая
Embarcadero C++ Builder, Microsoft Visual C++, Apple Xcode и Freescale CodeWarrior,
предоставляют аналогичные средства, доступ к которым осуществляется с помощью
меню Project (Проект).
Рассмотрим простой пример. Вместо того чтобы разбирать детали компиляции,
которые зависят от реализации, давайте сосредоточим внимание на более общих ас*
пектах, таких как проектирование.
Предположим, что решено разделить программу из листинга 7.12 на части и по*
местить используемые ею функции в отдельный файл. Напомним, что эта программа
преобразует прямоугольные координаты в полярные, после чего отображает резуль*
тат. Нельзя просто вырезать из исходного файла часть кода после окончания функции
main (). Дело в том, что main () и другие две функции используют одни и те же объяв*
ления структур, поэтому необходимо поместить эти объявления в оба файла. При про*
стом наборе объявлений в коде можно допустить ошибку. Но даже если объявления
скопированы безошибочно, при последующих модификациях нужно будет не Забыть
внести изменения в оба файла. Одним словом, разделение программы на несколько
файлов создает новые проблемы.
Кому нужны дополнительные сложности? Только не разработчикам С и C++. Для
решения подобных проблем была предоставлена директива #include. Вместо того
чтобы помещать объявления структур в каждый файл, их можно разместить в заголо*
вочном файле, а затем включать его в каждый файл исходного кода. Таким образом,
изменения в объявление структуры будут вноситься только один раз в заголовочный
файл. Кроме того, в заголовочный файл можно помещать прототипы функций.
Итак, исходную программу можно разбить на три части:
  • заголовочный файл, содержащий объявления структур и прототипы функций,
    которые используют эти структуры;
  • файл исходного кода, содержащий код функций, которые работают со структурами;
  • файл исходного кода, содержащий код, который вызывает функции работы со
    структурами.
Такая стратегия может успешно применяться для организации программы. Если,
например, создается другая программа, которая пользуется теми же самыми функция*
ми, достаточно включить в нее заголовочный файл и добавить файл с функциями в
проект или список make. К тому же такая организация программы соответствует прин*
ципам объектно-ориентированного программирования (ООП). Первый файл — заго*
ловочный — содержит определения пользовательских типов. Второй файл содержит
код функций для манипулирования типами, определенными пользователем. Вместе
оба файла формируют пакет, который можно использовать в различных программах.
В заголовочный файл не следует помещать определения функций или объявления
переменных. Хотя в простейших проектах такой подход может работать, обычно он
приводит к проблемам. Например, если в заголовочном файле содержится определе*
ние функции, и этот заголовочный файл включен в два других файла, которые явля*
ются частью одной программы, в этой программе окажется два определения одной и
той же функции, что вызовет ошибку, если только функция не является встроенной.
В заголовочных файлах обычно содержится следующее:
  • прототипы функций;
  • символические константы, определенные с использованием #define или const;
  • объявления структур;
  • объявления классов;
  • объявления шаблонов;
  • встроенные функции.
Объявления структур можно помещать в заголовочные файлы, поскольку они не
создают переменные, а только указывают компилятору, как создавать структурную пе*
ременную, когда она объявляется в файле исходного кода. Подобно этому объявления
шаблонов — это не код, который нуэдю компилировать, а инструкции для компиля*
тора, указывающие, каким образом генерировать определения функций, чтобы они
соответствовали вызовам функций, встречающимся в исходном коде. Данные, объяв*
ленные как const, и встроенные функции имеют специальные свойства связывания
(вскоре они будут рассмотрены), которые позволяют размещать их в заголовочных
файлах, не вызывая при этом каких-либо проблем.
В листингах 9.1, 9.2 и 9.3 показан результат разделения программы из листинга 7.12
на отдельные части. Обратите внимание, что при включении заголовочного файла
используется запись "coordin.h", а не <coordin.h>. Если имя файла помещено в
угловые скобки, компилятор C++ ищет его в той части базовой файловой системы,
где расположены стандартные заголовочные файлы. Но когда имя файла представле*
но в двойных кавычках, компилятор сначала ищет файл в текущем рабочем каталоге
или в каталоге с исходным кодом (либо в другом аналогичном месте, которое зависит
от версии компилятора). Не обнаружив заголовочный файл там, он ищет его в стан*
дартном местоположении. Таким образом, при включении собственных заголовочных
файлов должны использоваться двойные кавычки, а не угловые скобки.
На рис. 9.1 показаны шаги по сборке этой программы в системе Unix. Обратите
внимание, что пользователь только выдает команду компиляции СС, а остальные
действия выполняются автоматически. Компиляторы командной строки g++, gpp и
Borland C++ (Ьсс32 .ехе) ведут себя аналогичным образом. Среды разработки Apple
Xcode, Embarcadero C++ Builder и Microsoft Visual C++ в сущности выполняют те же
самые действия, однако, как упоминалось в главе 1, процесс инициируется по-друго*
му, с помощью команд меню, которые позволяют создавать проект и ассоциировать с
ним файлы исходного кода. Обратите внимание, что в проекты добавляются только
файлы исходного кода, но не заголовочные файлы. Дело в том, что заголовочными
файлами управляет директива #include. Кроме того, не следует использовать дирек*
тиву #include для включения файлов исходного кода, поскольку это может привести
к дублированным объявлениям.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// coordin.h -- structure templates and function prototypes
// structure templates
#ifndef COORDIN_H_
#define COORDIN_H_
 
struct polar
{
    double distance;    // distance from origin
    double angle;        // direction from origin
};
struct rect
{
    double x;        // horizontal distance from origin
    double y;        // vertical distance from origin
};
 
// prototypes
polar rect_to_polar(rect xypos);
void show_polar(polar dapos); 
 
#endif
Управление заголовочными файлами
Заголовочный файл должен включаться в файл только один раз. Это кажется простым тре-
бованием, которое легко запомнить и придерживаться, тем не менее, можно
непреднамеренно включить заголовочный файл несколько раз, даже не подозревая об этом. Например,
предположим, что используется заголовочный файл, который включает другой
заголовочный файл. В C/C++ существует стандартный прием, позволяющий избежать многократных
включений заголовочных файлов. Он основан на использовании директивы препроцессора
#ifndef (if not defined — если не определено). Показанный ниже фрагмент кода
обеспечивает обработку операторов, находящихся между директивами #if ndef и #endif, только в
случае, если имя coordin_h_ не было определено ранее с помощью директивы
препроцессора #defіпе:
#ifndef COORDIN_H_
#endif
Обычно директива #def ine используется для создания символических констант, как в
следующем примере:
#define MAXIMUM 4096
Однако для определения имени достаточно просто указать директиву #def ine с этим
именем:
#define COORDIN_H_
Прием, применяемый в листинге 9.1, предусматривает помещение содержимого файла
внутрь #ifndef:
#ifndef COORDIN_H_
#define COORDIN_H_
// здесь размещается содержимое включаемого файла
#endif

Когда компилятор впервые сталкивается с этим файлом, имя coordin_h_ должно быть
неопределенным. (Во избежание совпадения с существующими именами, имя строится на
основе имени включаемого файла и нескольких символов подчеркивания.)
В этом случае компилятор будет обрабатывать код между директивами #ifndef и #endif,
что, собственно, и требуется. Во время обработки компилятор читает строку с директивой,
определяющей имя coordin_h_. Если затем компилятор обнаруживает второе включение
соогdin.h в том же самом файле, он замечает, что имя coordin_h_ уже определено, и пере-
ходит к строке, следующей после #endif. Обратите внимание, что данный прием не предот-
вращает повторного включения файла. Вместо этого он заставляет компилятор игнорировать
содержимое всех включений кроме первого. Такая методика защиты используется в большин-
стве стандартных заголовочных файлов С и C++. Если ее не применять, одна и та же структура,
например, окажется объявленной в файле дважды, что приведет к ошибке компиляции.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// file1.cpp -- example of a three-file program
#include <iostream>
#include "coordin.h" // structure templates, function prototypes
using namespace std;
int main()
{
    rect rplace;
    polar pplace;
 
    cout << "Enter the x and y values: ";
    while (cin >> rplace.x >> rplace.y)  // slick use of cin
    {
        pplace = rect_to_polar(rplace);
        show_polar(pplace);
        cout << "Next two numbers (q to quit): ";
    }
    cout << "Bye!\n";
// keep window open in MSVC++
/*
    cin.clear();
    while (cin.get() != '\n')
        continue;
    cin.get();
*/
    return 0; 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// file2.cpp -- contains functions called in file1.cpp
#include <iostream>
#include <cmath>
#include "coordin.h" // structure templates, function prototypes
 
// convert rectangular to polar coordinates
polar rect_to_polar(rect xypos)
{
    using namespace std;
    polar answer;
 
    answer.distance =
        sqrt( xypos.x * xypos.x + xypos.y * xypos.y);
    answer.angle = atan2(xypos.y, xypos.x);
    return answer;      // returns a polar structure
}
 
// show polar coordinates, converting angle to degrees
void show_polar (polar dapos)
{
    using namespace std;
    const double Rad_to_deg = 57.29577951;
 
    cout << "distance = " << dapos.distance;
    cout << ", angle = " << dapos.angle * Rad_to_deg;
    cout << " degrees\n";
}
В результате компиляции и компоновки этих двух файлов исходного кода и нового
заголовочного файла получается исполняемая программа. Ниже приведен пример ее
выполнения:
Enter the x and у values : 120 80
distance = 144.222, angle = 33.6901 degrees
Next two numbers (q to quit) : 120 50
distance = 130, angle = 22.6199 degrees
Next two numbers (q to quit) : q
Кстати, хотя мы обсудили раздельную компиляцию в терминах файлов, в
стандарте C++ вместо термина файл используется термин единица трансляции, чтобы
сохранить более высокую степень обобщенности; файловая модель — это не единственный
способ организации информации в компьютере. Для простоты в этой книге будет
применяться термин "файл", но помните, что под этим понимается также и "единица
трансляции".

чего тут сложного?
Миниатюры
Какую ide лучше использовать для c++  
 
Текущее время: 15:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru