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

Для чего нужен define? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Работа со строками. Связное хранение строк. http://www.cyberforum.ru/cpp-beginners/thread43045.html
Постановка задачи В текстовом файле хранится последовательность слов. Предполагается, что слово содержит не более 20 букв, слова отделяются друг от друга одним или бо-лее пробелами, количество слов...
C++ Нужно исправить 2 ошибки в коде собственно, САБЖ. нужно исправить 2 ошибки в коде, чтобы его можна было скомпилить и сделать из него ехе-шник. код немалый, тому залил на sendspace: http://sendspace.com/file/ubkkh6 времени... http://www.cyberforum.ru/cpp-beginners/thread43015.html
Вывод случайных текстов на экран C++
помогите пожалуйста, мне нужен код для случайных выводов текстов на экран
C++ обход массива рендом.
Дан массив 10 на 10. Рендом выбираем точку, сравниваем элемент... Затем нужно опять выбирать рендом элемент, но так что бы не выбирать тот, который уже брали. Как можно запомнить, что выбирали уже, а...
C++ Не работает цикл for С++ Borland http://www.cyberforum.ru/cpp-beginners/thread42959.html
Элементарная программа: #include <iostream.h> #include <graphics.h> #include <math.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <dos.h> void main ()
C++ Программа производит неправильный вывод Помогите найти ошибку!!! Заранее спасибо!!! #include <iostream.h> main (void) { int a = 1; void f() { int b = 1; подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17944 / 6175 / 411
Регистрация: 30.03.2009
Сообщений: 16,948
Записей в блоге: 27
05.07.2009, 16:33
Попробую объяснить, как ситуация обстоит на самом деле. В процессе компиляции есть две стадии, которые условно можно считать независимыми. Это препроцессирование исходного текста и дальнейшая его трансляция.

На этапе препроцессирования у тебя просто обрабатывается текст (асбтрагированно от того, что это текст программы на языке Си или Си++) и делается подстановка всех define'ов

Т.е. возьмём вот такой пример:

C
1
2
3
4
5
6
7
8
9
10
11
#define N 20
 
int a[N];
int x;
 
void func (void)
{
  int i;
  for (i = 0; i < N; i++)
    x += a[i];
}
Сначала запускается препроцессирование, которое заменить все вхождения define'ов на их определения. Замена делается в ТЕКСТОВОМ виде. Т.е. после препроцессирования мы будем иметь такой промежуточный текст

C
1
2
3
4
5
6
7
8
9
int a[20];
int x;
 
void func (void)
{
  int i;
  for (i = 0; i < 20; i++)
    x += a[i];
}
Т.е. все вхождения N были заменены на 20. В дальнейшем этот текст уже отдаётся на трансляцию

Надо чётко понимать, что #define - это по большому счёту конструкция препроцессора, но не языка. Это НЕ глобальная переменная. Т.е. если написать такой код:

C
1
2
3
4
5
6
7
8
9
10
#define N 20
 
int a[N];
...
 
void func (void)
{
  int N;
  N++;
}
То в функции func НЕ будет заведена локальная переменная, как это вроде бы ожидалось. После препроцессирования текст будет такой:

C
1
2
3
4
5
6
7
8
int a[20];
...
 
void func (void)
{
  int 20;
  20++;
}
что на этапе трансляции вдаст ошибку

Теперь к вопросу, для чего это нужно. В конкретно данном примере этим макросом N я задал размер массива, а потом везде работал именно через макрос. Можно сразу написать 20, с точки зрения конкретно данного примера ничего не поменяется. НО. Если мне нужно поменять размер массива с 20 на 30, то я просто меняю значение define'а, а во всех остальных местах это фактически изменится автоматически. Если же писать непосредственно 20, то потом во всех местах надо менять 20 на 30, а таких мест может быть много

Ну я так описал самый примитив, чтобы понятно было. Мудростей и премудростей с препроцессированием довольно много

Добавлено через 2 минуты 42 секунды
Цитата Сообщение от Search.. Посмотреть сообщение
Define объявлена устаревшей в стандарте С++ (ISO). Вместо define нужно использовать const.
Скорее всего ты что-то путаешь. Возможно, речь шла вот о чём. Вси в качестве размерностей массива можно было указывать только константы и нельзя было переменные. Такми образом код

C
1
2
const int n = 20;
int a[n];
с точки зрения Си является некорректным. В Си++ они разрешили использовать в этом месте переменные (и выражения с ними), если переменная имеет модификатор const. А потом выдали рекомендацию использовать именно const переменную, а не макрос (ибо макрос штука опасная). Но уж точно не объявляли #define устаревшей.
13
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru