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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Работа со строками. Связное хранение строк. http://www.cyberforum.ru/cpp-beginners/thread43045.html
Постановка задачи В текстовом файле хранится последовательность слов. Предполагается, что слово содержит не более 20 букв, слова отделяются друг от друга одним или бо-лее пробелами, количество слов в файле не ограничено. Требуется: 1. Прочитать исходный текст из файла и поместить его в памяти, использовать однонаправленные циклические цепочки . Каждое звено текста размещается в памяти...
C++ Нужно исправить 2 ошибки в коде собственно, САБЖ. нужно исправить 2 ошибки в коде, чтобы его можна было скомпилить и сделать из него ехе-шник. код немалый, тому залил на sendspace: http://sendspace.com/file/ubkkh6 времени немного - до утра понедельника..выручайте, народ, пожалуйста http://www.cyberforum.ru/cpp-beginners/thread43015.html
Вывод случайных текстов на экран C++
помогите пожалуйста, мне нужен код для случайных выводов текстов на экран
C++ обход массива рендом.
Дан массив 10 на 10. Рендом выбираем точку, сравниваем элемент... Затем нужно опять выбирать рендом элемент, но так что бы не выбирать тот, который уже брали. Как можно запомнить, что выбирали уже, а что нет?
C++ Программа производит неправильный вывод http://www.cyberforum.ru/cpp-beginners/thread42956.html
Помогите найти ошибку!!! Заранее спасибо!!! #include <iostream.h> main (void) { int a = 1; void f() { int b = 1;
C++ Никак не могу найти ошибку #include<iostream.h> #include<conio.h> #include<math.h> #include<STDLIB.H> #include<COMPLEX.H> main() { const m=7, n=7; m5: int A,i,j,F; clrscr(); подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
05.07.2009, 16:33     Для чего нужен define?
Попробую объяснить, как ситуация обстоит на самом деле. В процессе компиляции есть две стадии, которые условно можно считать независимыми. Это препроцессирование исходного текста и дальнейшая его трансляция.

На этапе препроцессирования у тебя просто обрабатывается текст (асбтрагированно от того, что это текст программы на языке Си или Си++) и делается подстановка всех 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 устаревшей.
 
Текущее время: 14:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru