Easyelectronics.ru

Электроника для всех
Текущее время: 07 июл 2020, 21:49

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 140 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 сен 2018, 16:16 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
А можно чуть подробнее, что надо получить и желательно с кейсом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 сен 2018, 17:45 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 817
Ссылка на проект в первом сообщении темы.
На данный момент макрос различает тип числа в параметре, всё происходит на уровне препроцессора, то-есть дополнительный мышиный код не добавляется в прошивку, лишний просто не используется.
Есть идея менять местами число и текст, для этого необходимо каким-то образом определить что передаваемый параметр функции является текстом, либо числом, либо чем-то иным - для чего пока нет функции обработки.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 сен 2018, 19:44 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
А вам компилятор языка си дженерики использовать позволяет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 сен 2018, 19:52 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
http://rextester.com/AGI38365


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 сен 2018, 21:53 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 817
Mirmik писал(а):
А вам компилятор языка си дженерики использовать позволяет?

Прикольная вещь.
Цитата:
#define cast(from, to) _Generic((from), \
short: (short) (to), \
char: (char) (to), \
char*: (char*) (to), \
default: (void*) (to))

Насколько я верно понял, _Generic - это дальнейшее "развитие" __typeof__. И в данном случае используется как одно из разрешённых преобразований. В том смысле что идёт явный перебор возможных состояний, до момента когда логическая операция становится возможной.
Но в чистом си _Generic не работает.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 сен 2018, 23:02 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1204
AVI-crak писал(а):
Но в чистом си _Generic не работает.

Если С11 не чистый С, тогда С++11 - это не чистый С++?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 сен 2018, 23:18 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 817
gcc-arm-6-2017-q2, GNU++14
Но чего-то ещё не хватает, использование макроса вызывает ошибку. Я не смог найти файла, где определяется _Generic.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 сен 2018, 23:26 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1204
В табличке написано, что _Generic появились еще в gcc 4.9.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 сен 2018, 23:36 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 817
Версия gcc-arm-6-2017-q2 - определяется как голый металл, возможно в этом причина.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 сен 2018, 23:42 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1204
AVI-crak писал(а):
Версия gcc-arm-6-2017-q2 - определяется как голый металл, возможно в этом причина.

Не знаю, с С++14 у меня в gcc6 проблем не было, правда в некоторых средах могут к компилятору поддерживающему С++17 прикрутить хедеры от С++98 :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 26 сен 2018, 01:17 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
_Generic не определяется в заголовочных файлах. Это ключевое слово языка си. Оно поддерживается в c11 и, видимо в gnu98.
В с++ его действительно нет.

Одно из назначений _Generic - имитация с++ перегрузки в языке си.
Код:
#include <stdio.h>

void myprint_int(int i) { printf("%d", i); }
void myprint_str(const char * str) { printf("%s", str); }

#ifndef __cplusplus

#define myprint(x) _Generic(x, \
    const char *: myprint_str, \
    char *:         myprint_str, \
    int:              myprint_int  \
)(x)

#else

void myprint(int i) { myprint_int(i); }
void myprint(const char* str) { myprint_str(str); }

#endif

int main()
{
    myprint("HelloWorld");
    myprint(33);
}


Этот код работает и в с++ и в си.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 окт 2018, 13:51 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
По результатам настоящего обсуждения проапгрейдил комутатор своей либы отладочной печати вот до такого состояния:

Код:
#ifndef __cplusplus

#define dpr(X) _Generic((X),                    \
    const char*:        debug_print,            \
    char*:              debug_print,            \
    uint8_t:            debug_printdec_uint8,   \
    uint16_t:           debug_printdec_uint16,  \
    uint32_t:           debug_printdec_uint32,  \
    uint64_t:           debug_printdec_uint64,  \
    int8_t:             debug_printdec_int8,    \
    int16_t:            debug_printdec_int16,   \
    int32_t:            debug_printdec_int32,   \
    int64_t:            debug_printdec_int64,   \
    float:              debug_printdec_float,   \
    double:             debug_printdec_double,  \
    bool:               debug_print_bool        \
)(X)

#define dprhex(X) _Generic((X),                 \
    uint8_t:            debug_printhex_uint8,   \
    uint16_t:           debug_printhex_uint16,  \
    uint32_t:           debug_printhex_uint32,  \
    uint64_t:           debug_printhex_uint64,  \
    int8_t:             debug_printhex_int8,    \
    int16_t:            debug_printhex_int16,   \
    int32_t:            debug_printhex_int32,   \
    int64_t:            debug_printhex_int64,   \
    float:              debug_printhex_float,   \
    double:             debug_printhex_double   \
)(X)

#define dprln(X) do{dpr(X);dln();}while(0)
#define dprhexln(X) do{dprhex(X);dln();}while(0)

#else

static inline void dpr(char* obj) { debug_print(obj); }
static inline void dpr(const char* obj) { debug_print(obj); }
static inline void dpr(uint8_t obj) { debug_printdec_uint8(obj); }
static inline void dpr(uint16_t obj) { debug_printdec_uint16(obj); }
static inline void dpr(uint32_t obj) { debug_printdec_uint32(obj); }
static inline void dpr(uint64_t obj) { debug_printdec_uint64(obj); }
static inline void dpr(int8_t obj) { debug_printdec_int8(obj); }
static inline void dpr(int16_t obj) { debug_printdec_int16(obj); }
static inline void dpr(int32_t obj) { debug_printdec_int32(obj); }
static inline void dpr(int64_t obj) { debug_printdec_int64(obj); }
static inline void dpr(double obj) { debug_printdec_double(obj); }
static inline void dpr(float obj) { debug_printdec_float(obj); }
static inline void dpr(bool obj) { debug_print_bool(obj); }

static inline void dprhex(uint8_t obj) { debug_printhex_uint8(obj); }
static inline void dprhex(uint16_t obj) { debug_printhex_uint16(obj); }
static inline void dprhex(uint32_t obj) { debug_printhex_uint32(obj); }
static inline void dprhex(uint64_t obj) { debug_printhex_uint64(obj); }
static inline void dprhex(int8_t obj) { debug_printhex_int8(obj); }
static inline void dprhex(int16_t obj) { debug_printhex_int16(obj); }
static inline void dprhex(int32_t obj) { debug_printhex_int32(obj); }
static inline void dprhex(int64_t obj) { debug_printhex_int64(obj); }
static inline void dprhex(double obj) { debug_printhex_double(obj); }
static inline void dprhex(float obj) { debug_printhex_float(obj); }

template <typename T, typename ... Tail>
void dpr(const T& obj, const Tail& ... tail) {
    dpr(obj);
    debug_putchar(' ');
    dpr(tail ...);
}

template<typename ... T>
void dprln(const T& ... obj) {
    dpr(obj ...);
    debug_write("\r\n", 2);
}

template<typename T> void dprhexln(const T& obj) {
    dprhex(obj);
    debug_write("\r\n", 2);
}

#endif



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 окт 2018, 18:55 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 817
Прикольно.
Печать "Tes" и 7562580 распознаётся без ошибок? А то у меня как-то не взлетело.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 окт 2018, 20:26 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
Дайте код. Должно работать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 25 окт 2018, 21:41 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 817
Ну так оно не взлетело, я даже точки не фиксировал. Будет время, попробую ваш вариант.
Кстати dln() - чего делает?

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 26 окт 2018, 09:19 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
А. Я не так вас понял. Думал, вы уже этот вариант успели попробовать.

Код:
static inline void debug_print_empty_line() {
   debug_putchar('\r');
   debug_putchar('\n');
}

#define dln() debug_print_empty_line()


Последний раз редактировалось Mirmik 26 окт 2018, 10:03, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 26 окт 2018, 10:03 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
Тест:

Код:
#include <gxx/debug/dprint.h>

int main(int argc, const char ** argv) {
      const char * hello = "HelloWorldHelloWorldHelloWorld";
   char* hello_ = (char*) hello;

   bool bool_var = true;
   const uint8_t a = 1;
   const int16_t b = 2;
   const uint32_t c = 3;
   const volatile int64_t d = 4;
   const volatile double f = 0.567;

   DTRACE();

   dprln(hello);
   dprln(hello_);

   dprln(a);
   dprln(b);
   dprln(c);
   dprln(d);

   DPRINT(a);
   DPRINT(b);
   DPRINT(c);
   DPRINT(d);
   
   dprln(0.126);
   dprln(bool_var);

   DPRINT(0.126);
   DPRINT(bool_var);

   debug_print_dump(hello, 30);
}


Вывод в си:
Код:
DTRACE: main
HelloWorldHelloWorldHelloWorld
HelloWorldHelloWorldHelloWorld
1
2
3
4
a:1
b:2
c:3
d:4
0.12600000
true
0.126:0.12600000
bool_var:true
0x000055F9045B5B38:48 65 6C 6C 6F 57 6F 72 HelloWor
0x000055F9045B5B40:6C 64 48 65 6C 6C 6F 57 ldHelloW
0x000055F9045B5B48:6F 72 6C 64 48 65 6C 6C orldHell
0x000055F9045B5B50:6F 57 6F 72 6C 64       oWorld


Вывод в с++:
Код:
DTRACE: int main(int, const char**)
HelloWorldHelloWorldHelloWorld
HelloWorldHelloWorldHelloWorld
1
2
3
4
a:1
b:2
c:3
d:4
0.12600000
true
0.126:0.12600000
bool_var:true
0x000055F3A62F4CE0:48 65 6C 6C 6F 57 6F 72 HelloWor
0x000055F3A62F4CE8:6C 64 48 65 6C 6C 6F 57 ldHelloW
0x000055F3A62F4CF0:6F 72 6C 64 48 65 6C 6C orldHell
0x000055F3A62F4CF8:6F 57 6F 72 6C 64       oWorld


Исходники:
https://github.com/Mirmik/gxx/blob/mast ... g/dprint.h
https://github.com/Mirmik/gxx/blob/mast ... unc_impl.c


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 26 окт 2018, 11:13 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 817
Очень короткие функции, блин, я так не умею.
У меня была идея простой печати: (текст, число), (текст, число, текст), (число), (текст), (число, текст, число) и так далее - до четырёх переменных во всех вариациях. Но у вас печать базовой функции по одному символу. Оно конечно будет у меня работать, но криво.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 26 окт 2018, 12:12 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
То, как и куда оно выводится, это вопрос имплементации. Это можно проработывать и перерабатывать, когда определен интерфейс.

Дайте вариант ожидаемого синтаксиса.
Наверняка его можно реализовать по предложенной выше схеме.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 26 окт 2018, 13:34 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 2471
AVI-crak писал(а):
Очень короткие функции, блин, я так не умею.

Современный стиль написания (практически не зависит от языка):
- функция/метод должна помещаться на экран (не более 25 строк)
- у функция/метод должны иметь ровно одну ответственность (то есть делать что-то одно)
- работа функции должна быть понятна без документации (возможны исключения в случае сложных специфичных алгоритмов)

P.S. в энтерпрайз программировании эти правила, зачастую, являются обязательными и жестко контролируются через ревью


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 26 окт 2018, 14:01 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
Это с опытом приходит.
Когда программа начинает писать себя сама, не задумываешься над тем, какая длина у функции.

Такая, какая нужна.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 26 окт 2018, 15:00 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 817
Mirmik писал(а):
Дайте вариант ожидаемого синтаксиса.
Наверняка его можно реализовать по предложенной выше схеме.

Ну так чуть выше, любая последовательность из параметров количеством до 4 штук, хотя хватит и трёх.
Думаю нужно описать три варианта для функции с одним параметром, с двумя, и тремя. На хабе была статья на эту тему, но у меня не получилось. Там декларация функции переписывались препроцессором для нескольких вариантов написания. Может у кого память лучше... я ссылку потерял.

А с одним параметром работает, уже проверил.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 26 окт 2018, 19:56 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
Код:

#define CONCAT(a,b) a##b
#define CONCAT2(a,b) CONCAT(a,b)

#define ELEVENTH_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, ...) a11
#define COUNT_ARGS(...) ELEVENTH_ARGUMENT(_, ##__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)

#define dpr_(X) _Generic((X),                    \
    const char*:        debug_print,            \
    char*:              debug_print,            \
    uint8_t:            debug_printdec_uint8,   \
    uint16_t:           debug_printdec_uint16,  \
    uint32_t:           debug_printdec_uint32,  \
    uint64_t:           debug_printdec_uint64,  \
    int8_t:             debug_printdec_int8,    \
    int16_t:            debug_printdec_int16,   \
    int32_t:            debug_printdec_int32,   \
    int64_t:            debug_printdec_int64,   \
    float:              debug_printdec_float,   \
    double:             debug_printdec_double,  \
    bool:               debug_print_bool        \
)(X)

#define dpr(...) CONCAT2(dpr_, COUNT_ARGS(__VA_ARGS__))(__VA_ARGS__)

#define dpr_1(X) dpr_(X)
#define dpr_2(X,Y) do{dpr_(X); dprchar(' '); dpr_(Y);}while(0)
#define dpr_3(X,Y,Z) do{dpr_(X); dprchar(' '); dpr_(Y); dprchar(' '); dpr_(Z);}while(0)
#define dpr_4(X,Y,Z,W) do{dpr_(X); dprchar(' '); dpr_(Y); dprchar(' '); dpr_(Z); dprchar(' '); dpr_(W);}while(0)

#define dprln(...) do{dpr(__VA_ARGS__); dln();}while(0)



Код:
dprln("mirmik", "was", "here", 1111);
/// mirmik was here 1111\n


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 28 окт 2018, 07:27 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 817
Заработало!!!, код в шапке темы.
Огромное спасибо Mirmik за примеры.
И теперь чтобы самому создавать подобные вещи - мне-бы хотелось узнать как эта магия работает. Причём с самой шапки.

#define CONCAT(a,b) a##b
Не понятно что склеивает в применении к функции/макросу - текст, имя переменной, или текстовое имя типа параметра. И в каком виде возвращает.

#define CONCAT2(a,b) CONCAT(a,b) - смысл второй строчки?

#define ELEVENTH_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, ...) a11
Вычисление количества аргументов функции, нечто подобное уже видел. Но там последний символ (а11) применялся в макросах ниже, и почти всегда был вида "_ХХ"

#define COUNT_ARGS(...) ELEVENTH_ARGUMENT(_, ##__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
Не ожидать запятую, склеить с чем? И почему обратный порядок цифр - чего он вообще делает.

#define dpr_2(X,Y) do{dpr_(X); soft_print(" "); dpr_(Y);}while(0)
Я не понимаю, для чего используется цикл.

Результат работы виден в автозаполнении как макрос - есть возможность седлать его функцией?

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Слепая печать float/uint(8-32)_t/int(8-32)_t замена printf
СообщениеДобавлено: 28 окт 2018, 09:42 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
AVI-crak писал(а):
#define CONCAT(a,b) a##b
Не понятно что склеивает в применении к функции/макросу - текст, имя переменной, или текстовое имя типа параметра. И в каком виде возвращает.

#define CONCAT2(a,b) CONCAT(a,b) - смысл второй строчки?


Правило такое: Если аргумент макроса является макровыражением, он раскрывается перед вызовом внешнего макроса кроме случаев, когда к нему внутри макроса применены ## или # (Это очень запутано. Подробнее тут https://gcc.gnu.org/onlinedocs/cpp/Argu ... nt-Prescan). Соответственно, CONCAT2 используется для того, чтобы конкатенация произошла только после раскрытия второго аргумента.
dpr(x,y) : Если остановиться на CONCAT, получится dpr_COUNT_ARGS(x,y)(x,y), а с CONCAT2 получается dpr_2(x,y).

AVI-crak писал(а):
#define ELEVENTH_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, ...) a11
Вычисление количества аргументов функции, нечто подобное уже видел. Но там последний символ (а11) применялся в макросах ниже, и почти всегда был вида "_ХХ"


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

AVI-crak писал(а):
#define COUNT_ARGS(...) ELEVENTH_ARGUMENT(_, ##__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
Не ожидать запятую, склеить с чем? И почему обратный порядок цифр - чего он вообще делает.


Давайте расскрывать. Я пока уберу конкатенацию:
COUNT_ARGS(x,y,z)
ELEVENTH_ARGUMENT(_, __VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
ELEVENTH_ARGUMENT(_, x, y, z, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
А теперь смотрим, какой аргумент у нас одинадцатый... Ба, да этож 3!!!
А вот, зачем там конкатенация и непонятный первый параметр - я до конца не понял. Так было в источнике. Наверное, есть какие-то частные случаи, когда это полезно.

AVI-crak писал(а):
#define dpr_2(X,Y) do{dpr_(X); soft_print(" "); dpr_(Y);}while(0)
Я не понимаю, для чего используется цикл.


Стандартная практика для оборачивания макроса в единый statement. Теперь можно написать for(int i = 0; i < 3; ++i) dpr(i, i+1); и это будет корректно обработанео. Затрудняюсь сказать, почему нельзя просто обернуть блоком. В ядре линукса принята такая конструкция.

AVI-crak писал(а):
Результат работы виден в автозаполнении как макрос - есть возможность седлать его функцией?


Нету возможность отработать этот вопрос, но, полагаю, достаточно определить
void dpr(...);
до макроса.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 140 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB