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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 176, средняя оценка - 4.74
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,342
Завершенные тесты: 1
#1

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

05.07.2009, 13:29. Просмотров 23953. Ответов 34
Метки нет (Все метки)

Для чего нужен оператор define?
например код


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
#define N 20            /* сколько первых чисел посчитать */
 
void main(){
    int fibs[N], index;
 
    fibs[0] = 1;    /* индексы отсчитываются с нуля!!! */
    fibs[1] = 1;
 
    /* Тут показано, что индекс элемента массива может вычисляться */
 
    for(index=2; index < N; index++)
        fibs[index] = fibs[index-1] + fibs[index-2];
 
    /* Распечатка в обратном порядке */
    for(index = N-1; index >= 0; index--)
        printf("%d-ое число Фибоначчи есть %d\n",
            index+1,                   fibs[index]);
}
 
Здесь мы видим новый для нас оператор #define
Он задает текстуальную ЗАМЕНУ слова N на слово 20,
в данном случае просто являясь эквивалентом
 
    const int N = 20;



неьзя ли edfine удалить и вместо N написать 20????
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2009, 13:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Для чего нужен define? (C++):

Для чего нужен с++? - C++
Я школьник, мне 16 лет, учусь в 10 классе, планирую поступить на факультет защиты информационных технологий. Сейчас начал изучать с++, не...

Для чего нужен EOF? - C++
задание такое:написать программу, печатающую все вводимые символы в верхнем регистре, в строку выодится 16ричный и 8ричный код. #include...

Для чего нужен Sizeof - C++
Вот строка memcpy(pMatrPr, pMatr, sizeof(double) * n * m); Это копирование исходной матрицы в преобразованную А что такое...

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

Для чего нужен символ \b? - C++
для чего нужен символ \b??

Виртуальный деструктор, для чего нужен? - C++
Я конечно понимаю, что Но объясните поподробнее и попонятнее для чего это нужно

34
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,342
Завершенные тесты: 1
05.07.2009, 20:53  [ТС] #16
Цитата Сообщение от korisk Посмотреть сообщение
Вообще говоря, они не эквивалентны.
В случае, если вы используете константу, то под неё выделяется память в сегменте данных, и для обращения к ней используется команда с косвенной адресацией.
В случае макроопределения #define, память под наше число выделяется в сегменте кода и для доступа к числу используются команды для работы с константой(они обычно быстрее)

Но заменить define на константу можно, и изменение в поведении программы будет едва ли заметно
спасибо..но по человечески можно?

Добавлено через 2 минуты 15 секунд
Evg, спасибо!Я уже в книге прочел)но спасибо что отзовился
0
korisk
12 / 12 / 1
Регистрация: 06.06.2009
Сообщений: 49
05.07.2009, 21:15 #17
Цитата Сообщение от @lex Посмотреть сообщение
спасибо..но по человечески можно?
я имел ввиду, что определяя константу разными способами, мы получаем разные бинарники(без оптимизации) ) и поэтому эти способы не эквивалентны.
Evg все лучше объяснил
0
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,342
Завершенные тесты: 1
05.07.2009, 21:18  [ТС] #18
Цитата Сообщение от korisk Посмотреть сообщение
Evg все лучше объяснил
да очно
0
Search..
06.07.2009, 02:21
  #19

Не по теме:

Я в шоке... Я еще видите ли, правило форума какое-то нарушил. Я в шоке от тебя (от тебя, Хитрый Ментай)....

0
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,342
Завершенные тесты: 1
06.07.2009, 12:01  [ТС] #20
Search..,
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
06.07.2009, 14:04 #21
Для функций безопасней будет использовать не #define, а делать обычные функции. Можно inline. Так как, это убережет нас при проверке типов входящих переменных. Например макрос позволит сделать так:
C
1
2
#define MIN(a, b) a<b?a:b
   printf("%d\n", MIN("five",3));
Хотя, и выдаст предупреждение. Тем самым, определив свою функцию принимающую, например, только int, мы обезопасим себя от некоторых проблем (не только указанной выше) связанных с макроопределениями. Хотя, конечно, что использовать лучше зависит от контекста.

Добавлено через 1 минуту 28 секунд
@lex, вот если бы ты хотел, ты бы сам все нашел:
http://www.citforum.ru/programming/cpp_march/cpp_054.shtml
лентяи...
0
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,342
Завершенные тесты: 1
06.07.2009, 14:55  [ТС] #22
Цитата Сообщение от Vourhey Посмотреть сообщение
@lex, вот если бы ты хотел, ты бы сам все нашел:
http://www.citforum.ru/programming/c.../cpp_054.shtm
там не понятно написано

Добавлено через 35 секунд
Vourhey, лучший ответ нашел в своем учебнике
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
06.07.2009, 15:22 #23
@lex, вот че ты его раньше не нашел? Все ведь можно найти. Нет ведь, я если за 10 секунд не нашел ответа, я лучше спрошу и буду привыкать к тому, что меня тащат за уши..эх..
Здесь везде тоже непонятно написано:
http://www.google.ru/search?hl=ru&ne...A&lr=&aq=f&oq=
?
0
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,342
Завершенные тесты: 1
06.07.2009, 20:01  [ТС] #24
Цитата Сообщение от Vourhey Посмотреть сообщение
Здесь везде тоже непонятно написано:
http://www.google.ru/search?hl=ru&ne...A&lr=&aq=f&oq=
ага там везде дельфи и С#
0
pigah
12 / 12 / 2
Регистрация: 05.07.2009
Сообщений: 147
Записей в блоге: 1
10.07.2009, 03:04 #25
define - это именованная константа то есть тип определяется автоматически (не рекомендуется использовать);
const - это типизированная константа тип задается программистом (рекомендуется);
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
10.07.2009, 08:46 #26
define - это именованная константа то есть тип определяется автоматически (не рекомендуется использовать);
Ну-ну.
Слово препроцессор тебе о чем нибудь говорит ?
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
17.07.2009, 17:17 #27
Я бы предложил усовершенствовать файл t.h до правильного

C
1
2
3
4
5
6
7
/* Файл t.h */
#ifndef _T_H
#define _T_H
 
extern int func (int);
 
#endif
0
Evg
Эксперт CАвтор FAQ
18370 / 6417 / 441
Регистрация: 30.03.2009
Сообщений: 17,803
Записей в блоге: 28
17.07.2009, 18:57 #28
Цитата Сообщение от odip Посмотреть сообщение
Я бы предложил усовершенствовать файл t.h до правильного
До правильного совершенствовать его следует с объяснением, зачем это так, а так же с примером, когда возникает повторый инклюд
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
17.07.2009, 19:02 #29
Я бы предложил усовершенствовать файл t.h до правильного

Код
/* Файл t.h */
#ifndef _T_H
#define _T_H
 
extern int func (int);
 
#endif
Обрамление h-файлов в такую синтаксическую конструкцию позволяет срабатывать коду внутри только один раз.
При большом кол-ве файлов или в случае вложенных h-файлов вы легко можете ошибиться и случайно или специально два раза включить h-файл.
0
Evg
Эксперт CАвтор FAQ
18370 / 6417 / 441
Регистрация: 30.03.2009
Сообщений: 17,803
Записей в блоге: 28
17.07.2009, 20:01 #30
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Тут в соседней теме возник вопрос, зачем нужно *.h файлы использовать, а потому вкратце добавлю то, как работает директива #include

#include ничего умного не делает, она целиком подставляет файл, который передан параметром директиве. Т.е. если мы имеем исходники

C
1
2
3
4
5
6
/* Файл t1.c */
#include "t.h"
int main (void)
{
  return func (1);
}
C
1
2
3
4
5
6
7
/* Файл t2.c */
#include "t.h"
int
func (int x)
{
  return x;
}
C
1
2
/* Файл t.h */
extern int func (int);
То после препроцессирования файла t1.c получим код:

C
1
2
3
4
5
6
 <--- комментарии удаляются на этапе препроцессирования
extern int func (int); <--- сюда подставилось содержимое файла t.h
int main (void)
{
  return func (1);
}
а после препроцессирования t2.c вот такой:

C
1
2
3
4
5
6
extern int func (int);
int
func (int x)
{
  return x;
}
Таким образом, описав что-то в *.h файле, это что-то попадает на трансляцию всех модулей, обеспечиывая "одинаковость". То, что файл имеет расширение *.h - это условность. Инклюдить можно всё, что угодно
8
17.07.2009, 20:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2009, 20:01
Привет! Вот еще темы с ответами:

Для чего нужен шаблон <typename T> - C++
Здравствуйте. template &lt;typename T&gt; T CLAMP(const T&amp; value, const T&amp; low, const T&amp; high) { return (value &lt; low) ? low : ((value...

Для чего нужен класс auto_ptr_ref? - C++
Здравствуйте, можно поконкретней, для чего нужен класс auto_ptr_ref? Спасибо.

Для чего нужен тип void? - C++
для чего нужна функция void

Прототип функции.Для чего нужен - C++
для чего нужен прототип в этом примере int func(int a, int b); int main(){...} int func(a,b){ ... return a+b; } если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.