1.8. Макросы. Ввод-вывод

В качестве продвинутой темы первой лекции рассмотрим применение макросов в C++. Макрос можно условно назвать функцией обработки и замены программного кода: после сборки программы макросы заменяются макроопределениями. Вот как это выглядит на примере подмены функции:

#include <iostream>
using namespace std;

#define SUM(x, y) (x + y)

int main()
{
	int a = 5;
	int b = 10;
	int sum = SUM(a, b);
	cout << sum;
    return 0;
}

Этот код преобразуется препроцессором в следующий:

#include <iostream>
using namespace std;

int main()
{
	int a = 5;
	int b = 10;
	int sum = (a + b);
	cout << sum;
    return 0;
}

Помимо макросов, которые подменяют функции, есть и другие очень полезные директивы препроцессора. Вот некоторые из наиболее часто используемых:

#include — включить содержимое стороннего файла в текущий файл, #ifdef, ifndef, #endif — задать условие для компиляции, #define — определить константу (и, конечно же, макрос).

С помощью #ifdef довольно часто задаётся условная компиляция блоков кода на основе некоторого условия, а так же условие для компиляции на различных версиях ОС.

#ifndef MACROS
#define MACROS

/* гарантирует включение заголовочных файлов только один раз */

#endif // MACROS

Ввод-вывод

В данном курсе мы будем использовать только систему ввода/вывода из С++ (не смотря на то, что функции ввода-вывода из C таже работают, но имеют чуть сложный синтаксис). Для ввода/вывода в C++ используется библиотека iostream (Input Output stream). Вывод на экран мы с вами уже использовали в примерах выше происходит при помощи оператора cout со стрелками “меньше” << и перевода каретка на новую строку с помощью endl. Ввод же использует оператор cin со стрелками “больше” >>

#include <iostream>
using namespace std;
 
int main()
{
   cout << "Enter a number: "; // просим пользователя ввести любое число
   int a = 0;
   cin >> a; // получаем пользовательское число и сохраняем его в переменную a
   cout << "You entered " << a << endl;
   return 0;
}

Когда необходимо задать форматированный вывод данных можно опять таки воспользоваться следующим подходом. Для задания точного значения количества чисел после запятой нужно вызывать precision на cout. После этого данное форматирование будет применено для следующих данных на печать:

#include <iostream>
using namespace std;

int main() {
    double e = 2.17182845904590;
    cout.precision(2);
    cout << fixed << e << endl; // 2.17
    return 0;
}

Пространства имен

В кадлом примере включалась следующая инструкция (после макросов #include) - using namespace std;. Данная инструкция “регистрирурет” в программе те функции и операторы, которые содержатся в пространстке std. Её можно не писать, но тогда пример выше будет выгладить многословнее:

#include <iostream>
 
int main()
{
   std::cout << "Enter a number: "; // просим пользователя ввести любое число
   int a = 0;
   std::cin >> a; // получаем пользовательское число и сохраняем его в переменную a
   std::cout << "You entered " << a << std::endl;
   return 0;
}