Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1

Насколько оправдано в данном случае использование макросов?

30.08.2017, 20:26. Показов 1638. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос в шапке, код(проверен на std=C89):
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
25
26
27
28
29
30
#ifdef  _REENTERANT
    #include    <pthread.h>
    pthread_mutex_t lm=PTHREAD_MUTEX_INITIALIZER; /*simple fast mutex*/
    #define RETURN(code)    {pthread_mutex_unlock(&lm); return code;}
    #define LOCK            {pthread_mutex_lock(&lgm);}
#else
    #define RETURN(code)    {return code;}
    #define LOCK
#endif
 
#ifdef  _ZLIB
    #include                        <zlib.h>
    gzFile                          ld =NULL;
    #define OPEN(nam)               gzopen(nam,"wt9");
    #define PRINTF                  gzprintf
    #define FFLUSH                  gzflush(ld,Z_SYNC_FLUSH);
    #define CLOSE                   gzclose(ld);
#else
    FILE            *ld=NULL;
    #define PRINTF                  fprintf 
    #define OPEN(nam)               fopen(nam,"wt");
    #define FFLUSH                  fflush(ld);
    #define CLOSE                   fclose(ld);
#endif
 
#ifdef  _FLUSH
    #define FLUSH   FFLUSH
#else
    #define FLUSH
#endif
Всё это внутри кода, хидер не затрагивает.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.08.2017, 20:26
Ответы с готовыми решениями:

Оправдано ли использование БД? Если да, то насколько?
Понравился форум, решил спросить. Есть у меня текстовые данные 20 -40мб (может и больше). С текстом будут производиться операции поиска и...

XML сериализация: насколько оправдано использование Convert.ChangeType
Насколько стремно использовать такие конструкции (Convert.ChangeType) public class Serializer { public object...

Потоки в VB .NET - в каком случае их использование оправдано?
Прошу подсказать по потокам. Смысл потоков узнал только сегодня, наткнувшись на пример winkode Код примера: Imports...

11
 Аватар для _JohnSmith
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
30.08.2017, 20:44
Разве не видите? Макрос один, к примеру OPEN(nam), а в зависимости от наличия библиотек подстановки разные. Это позволяет "унифицировать" код. Иначе пришлось бы по всему коду писать так:
C
1
2
3
4
5
6
7
8
9
10
11
12
...
#ifdef _ZLIB
   gzopen(...);
#else
  fopen(...);
#endif
...
#ifdef _ZLIB
  gzclose(...);
#else
  fclose(...);
#endif
А эти макросы позволяют писать так:
C
1
2
3
4
5
...
OPEN(nam);
...
CLOSE();
...
Добавлено через 2 минуты
Цитата Сообщение от drfaust Посмотреть сообщение
Всё это внутри кода, хидер не затрагивает.
Значит эти макросы касаются только того модуля где присутствуют.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
30.08.2017, 20:50  [ТС]
Ну именно этого я и добивался. Хочу узнать про "злоупотребления", про "нечитабельность" и т.д. Это всё воткнуто в реализации, т.е. в H-файле только комментарий с какими опциями и для чего можно компилить...

И да в 4й строке очепятка - должно быть pthread_mutex_unlock(&gm); ...

З.Ы. Идеалист я, там где "для себя" и "время позволяет"\

З.З.Ы. Может кто хитрее и понятнее придумает, но, главное в макросах, для меня, понятливость и читабельность кода...
0
 Аватар для _JohnSmith
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
30.08.2017, 21:26
Цитата Сообщение от drfaust Посмотреть сообщение
Хочу узнать про "злоупотребления", про "нечитабельность" и т.д.
Обычная практика сишника. Средства языка скудны, но это не существенный недостаток, все таки пол века прошло. Как раз читабельность Вы и оптимизировали вместо тысяч ifdef'ов написав пару тройку.

Добавлено через 8 минут
drfaust, я бы на Вашем месте убрал семиколоны из некоторых макросов. Тогда их можно будет использовать как часть выражений, например в условиях
C
1
if (CHECK_RETVATL(OPEN(...))) {...}
И еще полезная фишка приучить себя писать так:
C
1
2
3
4
// before
#define OPEN(nam)               gzopen(nam,"wt9");
//afyer
#define OPEN(nam)               (gzopen(nam,"wt9"))
У меня это уже привычка — все макросы обрамлять круглоыми скобками. Отсутствие скобок может стать источником трудноуловимых ошибок. Например вот:
C
1
2
#define CONST 2 + 2
int foo = CONST * CONST; // 2 + 2 * 2 + 2
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
30.08.2017, 21:58  [ТС]
Цитата Сообщение от _JohnSmith Посмотреть сообщение
все макросы обрамлять круглоыми скобками.
Вот тут интересно. Как себя ведут вложенные круглые скобки при вызове функций на std=c89 ... :
C
1
2
3
4
5
6
PRINTF(filed,"\n");
 FLUSH
 
 va_end (params);
 
 RETURN()
0
 Аватар для _JohnSmith
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
30.08.2017, 22:03
Цитата Сообщение от drfaust Посмотреть сообщение
Как себя ведут вложенные круглые скобки при вызове функций на std=c89
Как обычно. Сначала вычисляется выражение в скобках.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
30.08.2017, 22:25  [ТС]
Для выражений.
А я делаю "подмену имён" функций
C
1
#define PRINTF                  fprintf
как сделать что бы и это работало
C
1
PRINTF(stdout,"A=%i, B=%f", a,b);
и это
C
1
PRINTF(stdout,"\n\r");
Плодить макросы вида PRINTF, PRINTF(arg1), PRINTF2(arg1,arg2) неохота.

Где смог закруглил вызовы функций в "{}"

И да, а где у меня семиколоны-то?
0
 Аватар для _JohnSmith
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
30.08.2017, 22:32
drfaust, так не тотально же. В данном случае это конечно не нужно. Обрамление в фигурные скобки лишает Вас возможности использовать макросы как часть выражений. Обрамлять ими нужно, например циклы, составные выражения. В любом случае всегда надо смотреть по ситуации. Замена одного имени на другое не нуждается ни в каих скобках. С заменой вызова функции дела могут обстоять иначе. Вызов функции есть выражение, выражение вычисляется, так зачем лишать себя возможности использовать результат вычисленного выражения?
1
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
30.08.2017, 22:45  [ТС]
Хорошо. Правомочна ли такая инструкция в C89:
C
1
(printf)("F=%i",f);
Согласно стандарту (printf) => указатель на функцию printf. А вот ли воспримет ли синтаксис языка Си вышеупомянутое.
Я ограничен gcc и clang, но они не показатель соответствия стандарту C89

Добавлено через 8 минут
Проверил, работает... Но надо уточнить использование "()" при подмене имён/вызовов функций...
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[faust@archlinux C]$ gcc -std=c89  1.c
[faust@archlinux C]$ ./a.out
hELLO WORLD[faust@archlinux C]$ clang -std=c89  1.c
[faust@archlinux C]$ ./a.out
hELLO WORLD[faust@archlinux C]$ gcc --version
gcc (GCC) 7.1.1 20170630
Copyright (C) 2017 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая 
коммерческую ценность и применимость для каких-либо целей.
 
[faust@archlinux C]$ clang --version
clang version 4.0.1 (tags/RELEASE_401/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
[faust@archlinux C]$ cat ./1.c
#include <stdio.h>
 
int main()
{
 
   (printf)("hELLO WORLD");
return 0;
}[faust@archlinux C]$
Надо снова вчитываться в стандарт....
0
 Аватар для _JohnSmith
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
30.08.2017, 23:06
drfaust, не заморачивайтесь, я же сказал Вам
Цитата Сообщение от _JohnSmith Посмотреть сообщение
В любом случае всегда надо смотреть по ситуации. Замена одного имени на другое не нуждается ни в каих скобках.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
01.09.2017, 10:56
drfaust, оправдано. По остальному вам _JohnSmith сказал.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
01.09.2017, 18:25  [ТС]
Спасибо всем. Оставим как есть, слегка допилив...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.09.2017, 18:25
Помогаю со студенческими работами здесь

SerialPort и потоки - оправдано ли их использование
Всё очень просто, для тех, у кого это не первый раз, помогите понять, как и где и вобще зачем использовать поток при работе с ВинФорм и...

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

На сколько оправдано использование конструкции try - catch
Все привет. Вот разбираюсь с кодом,который не так давно написал. И с ужасом обнаружил большое количество try - catch в методах, которые в...

Оправдано ли использование лотус для веб-приложений
Господа, хочется обменятся мнениями. Прошу проголосовав обосновать выбор. Как по вашему оправдано ли использование лотуса для...

Отличие структуры от класса (преимущества, недостатки) где использование структур оправдано
Кто что может сказать по теме - выскажитесь, а то никак не могу понять разницу, читал что можно вообще не заморачиваться и пропустить...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru