Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 152
1

#define: макросы

12.08.2017, 20:28. Показов 1421. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Веду разбирательство с директивами препроцессора и тут возник вопрос в чем смысл использования макросов, если те же самые действия можно прописать в теле программы или прибегнуть к использованию функции? Я написал код с использованием макроса и по мне гораздо проще не прибегая к его использованию.Прошу объяснить каким-нибудь простым конкретным примером ,если можно....
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
#include<stdio.h>
#include<math.h>
#pragma warning(disable:4996)
 
#define SUMMARRAY(x,y)   for (char i = 0; i < y; i++) x[0]+=x[i]; 
 
 
int main()
{
    
    int massiv[10] = { 0 };
 
    for (int i = 0; i < 10; i++)
    {
        massiv[i] = pow(i, 5);  
    }
 
    SUMMARRAY(massiv, 10);
 
    fprintf(stdout,"%d",massiv[0]);
    
    getch();
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.08.2017, 20:28
Ответы с готовыми решениями:

Как реализовать директиву #define для создания шаблона отпределения #define ?
Здравствуйте уважаемые. При написании программы появилась необходимость задать шаблон создания...

#define
Не работает следующий пример - если удалить строку 5 #define DEBUG, то программа должна была по...

#define и const
В чем их различия? Делая тест по подготовке к ЕГЭ, в заданиях части С были фрагменты кода, и...

Идентификатор в #define
Требуется,чтобы за место чисел были их текстовые значения: например,вместо цифры 1, была надпись...

31
738 / 543 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
12.08.2017, 20:32 2
лучше б вы макросом указали размер массива,а также в других местах где встречается это магическое число 10
1
Заклинатель змей
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,604
12.08.2017, 20:40 3
Roman2947, макросы встраиваются в код препроцессором и встроенный код работает намного быстрее, чем вызов функции с передачей управления. Но макросы увеличивают вес кода и не совсем безопасны (препроцессор не проверят типы переданных данных). В С++ существует более удачное решение -- inline-функции
2
41 / 41 / 16
Регистрация: 29.12.2016
Сообщений: 291
12.08.2017, 20:41 4
Roman2947, Когда код занимает несколько тысяч или десятков тысяч строк, не удобно весь листать и например менять размер массива, проще написать #define SIZE 10, а в коде допустим array[SIZE], ну и соответственно изменив в одном месте программы размер массива, он изменится во всей программе. Просто для удобства.
0
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 152
12.08.2017, 20:53  [ТС] 5
LightProger, LFC, почему Вы #define SIZE 10 относите к макросам?это разве не символические константы? я с Вами абсолютно согласен, что лучше использовать подобный метод, но меня больше озадачил пока макрос
C
1
#define SUMMARRAY(x,y)   for (char i = 0; i < y; i++) x[0]+=x[i];
В каком случае его использовать а в каком нет.
0
Заклинатель змей
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,604
12.08.2017, 20:59 6
Roman2947, можете использовать хоть везде, если уверенны, что всегда передаёте те типы, для которых используемые операторы определены, и если размер готового исполнимого файла не имеет значения
0
41 / 41 / 16
Регистрация: 29.12.2016
Сообщений: 291
12.08.2017, 21:00 7
Roman2947, Про макросы можете почитать здесь: https://learnc.info/c/macros.html
0
Evg
Эксперт CАвтор FAQ
21280 / 8303 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.08.2017, 21:04 8
Цитата Сообщение от Roman2947 Посмотреть сообщение
в чем смысл использования макросов
https://www.cyberforum.ru/blogs/18334/blog100.html раздел "8. Примеры использования препроцессорных директив на практике"
Ещё тут:
Тонкости языка С,define
Дизайн и эволюция: перегрузка макросов
Непростой препроцессор

А вообще у макросов довольно широкое применение, но это сложно пояснить начинающему. Примерно так же начинающему сложно понять, зачем нужны указатели, когда код (по мнению вышеобозначенного начинающего) можно написать и без них. При появлении более серьёзного опыта программирования понимание многих вещей придёт само собой. Можно было бы, например, послать смотреть исходники мультиархитектурных вещей типа ядра linux или glibc, но самостоятельно копаться в этих софтах (точнее, в тех местах, где много технических приёмов, построенных на макросах), довольно сложно
2
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 152
12.08.2017, 21:04  [ТС] 9
LightProger, с первых строк уже понял к чему Вы)) Я рассуждаю исходя из учебника, по которому я занимаюсь)так там четко разделено #define: символические константы и #define: макросы. Даже и не знаю кому верить)))Может меня ввели в заблуждение и поэтому я до сих не программист
0
Evg
Эксперт CАвтор FAQ
21280 / 8303 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.08.2017, 21:08 10
Цитата Сообщение от Roman2947 Посмотреть сообщение
так там четко разделено #define: символические константы и #define: макросы
К сожалению, некоторые афторы учебников сами толком не понимают того, о чём рассказывают другим. Иногда галиматья получается из-за того, что с другого языка переводил человек, который не особенно понимает, о чём идёт речь
2
41 / 41 / 16
Регистрация: 29.12.2016
Сообщений: 291
12.08.2017, 21:09 11
Roman2947, В некоторых учебниках неправильный перевод с английского языка. Часто встречаются опечатки и ошибки, лучше спросить на форуме, у знающих людей, если не понятно. Я конечно, к таким пока не отношусь, тоже начинающий.
0
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 152
12.08.2017, 21:11  [ТС] 12
Evg, Вы говорите про более серьезный опыт, так каким образом его набраться) вот буквально на днях изучил свой учебник, сейчас сижу и думаю что делать дальше,думаю начать все с начала и заполнить все свои пробелы, которые образовались в первой половине изучения так как когда я его открыл понятия не имел о чем речь.... просто,читал,читал ,читал)
0
41 / 41 / 16
Регистрация: 29.12.2016
Сообщений: 291
12.08.2017, 21:14 13
Цитата Сообщение от Roman2947 Посмотреть сообщение
Вы говорите про более серьезный опыт, так каким образом его набраться)
Как набраться? Решать задачи, писать код, опыт сам и придет. Раз прочитали литературу для начинающего, ищите другую, уже для профессионалов, изучайте. Я вот сегодня закончил курс "Основы программирования на языке Си", и сразу записался на другой, "Программирование в стандарте POSIX", и "Язык программирования С"-более развернутый курс, также читаю книги, решаю задачи, смотрю видео на ютубе.
0
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 152
12.08.2017, 21:17  [ТС] 14
LightProger, Возможно и этому есть место.Но тем не менее я доволен книгой по которой занимаюсь...не думаю что там все плохо в плане перевода..

Добавлено через 2 минуты
LightProger, кстати по поводу задач, что можете посоветовать, какие источники?
0
41 / 41 / 16
Регистрация: 29.12.2016
Сообщений: 291
12.08.2017, 21:20 15
Цитата Сообщение от Roman2947 Посмотреть сообщение
кстати по поводу задач, что можете посоветовать, какие источники?
Наберите в поиске Задачи по языку Си, там их тьма. У меня еще наставник есть, он меня задачами снабжает.
0
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 152
12.08.2017, 21:23  [ТС] 16
LightProger, Наставник-это огромный бонус...повезло)
0
41 / 41 / 16
Регистрация: 29.12.2016
Сообщений: 291
12.08.2017, 21:27 17
Цитата Сообщение от Roman2947 Посмотреть сообщение
Наставник-это огромный бонус...повезло)
Да, на одном из форумов познакомились, напросился в ученики, человек согласился, я тогда язык JAVA, изучал, он меня переубедил сначала Си изучить, а его производные потом пойдут сами собой. Уже несколько месяцев занимаемся онлайн.
0
Evg
Эксперт CАвтор FAQ
21280 / 8303 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.08.2017, 21:31 18
Цитата Сообщение от Roman2947 Посмотреть сообщение
так каким образом его набраться
Элементарно: придумать себе задачу и реализовать её. Удобнее всего писать какие-нибудь примитивные игрушки. Пусть они никому не нужны, но опыта они принесут. А книги читать только тогда, когда появится реальная необходимость. И только те разделы, в которых появилась реальная необходимость. А взять книгу и попытаться её прочитать от начала и до конца - довольно бестолковое и бесполезное занятие

Ну и к слову, макросы, это далеко не та вещь, которую жизненно необходимо понимать начинающему

Добавлено через 2 минуты
В качестве задачи, с виду кажущейся неподъёмной, можешь почитать тут: Пишем свой интерпретатор языка BASIC. Да, осилить столько чужого диалога будет не просто. Но уверяю тебя, почерпнуть там опыта можно намного больше, чем тупо читая книги по языку программирования
1
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 152
12.08.2017, 21:33  [ТС] 19
LightProger, Надо искать кому напроситься в поддаваны)))реально порой бывает такой стопор, что хочется все бросить....но проходит буквально день и руки сами тянутся кодить....это уже похоже на зависимость...Был бы кто подскажет или направит было бы гораздо проще и продуктивнее...
1
41 / 41 / 16
Регистрация: 29.12.2016
Сообщений: 291
12.08.2017, 21:37 20
Цитата Сообщение от Roman2947 Посмотреть сообщение
но проходит буквально день и руки сами тянутся кодить....это уже похоже на зависимость...
)))) Это точно, я себе сделал расписание, один вечер поcвящаю изучению Linux, следующий вечер изучению языка Си, и так по порядку, надо еще английский подтянуть, но времени не хватает.
0
12.08.2017, 21:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.08.2017, 21:37
Помогаю со студенческими работами здесь

Массив, константы и #define
Всем доброго дня! Сразу к делу. Есть большое желание иметь массив длиной в константу и саму эту...

#define - что это?
#define HWREGBITW(x, b) \ ...

Как пользоваться #define
#define I2CSE2P_IO_DEFAULTS { NULL,\ 0,\ (void (*)(void *))I2CSE2P_init,\ ...

Некорректно работает #define
По идее, если что-нибудь ввести, то программа должна попытаться выполнить это как команду то есть...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru