LINUX.ORG.RU

Но, казалось бы, при чём тут рефлексия? Си это во многом «сделай сам». Нужно наследование - сделай сам. Нужно позднее связывание - сделай сам. Нужна рефлексия? Сделай сам!

yoghurt ★★★★★
()
#ifdef EBUG
    #define FNAME() fprintf(stderr, "\n%s (%s, line %d)\n", __func__, __FILE__, __LINE__)
    #define DBG(...) do{fprintf(stderr, "%s (%s, line %d): ", __func__, __FILE__, __LINE__); \
                    fprintf(stderr, __VA_ARGS__);           \
                    fprintf(stderr, "\n");} while(0)
#else
    #define FNAME()  do{}while(0)
    #define DBG(...) do{}while(0)
#endif //EBUG

extern int (*red)(const char *fmt, ...);
extern int (*green)(const char *fmt, ...);
#define RED         "\033[1;31;40m"
#define GREEN       "\033[1;32;40m"
#define OLDCOLOR    "\033[0;0;0m"

int (*red)(const char *fmt, ...);
int (*green)(const char *fmt, ...);

int r_pr_(const char *fmt, ...){
    va_list ar; int i;
    printf(RED);
    va_start(ar, fmt);
    i = vprintf(fmt, ar);
    va_end(ar);
    printf(OLDCOLOR "\n");
    return i;
}

int g_pr_(const char *fmt, ...){
    va_list ar; int i;
    printf(GREEN);
    va_start(ar, fmt);
    i = vprintf(fmt, ar);
    va_end(ar);
    printf(OLDCOLOR "\n");
    return i;
}
    if(isatty(STDOUT_FILENO)){ // make color output in tty
        red = r_pr_; green = g_pr_;
    }else{ // no colors in case of pipe
        red = printf; green = printf;
    }
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Эм… второй и третий примеры к __func__ имеют слабое (если быть радикальным, то можно даже сказать никакое) отношение. А первый, ну как-то слабо… не совсем понятно, зачем мне название ф-ии в дебаге. Я его и так могу посмотреть, зная номер строки. Да, иногда конечно инфа полезная, но не настолько, что бы делать это частью стандарта. И самый главный вопрос: какое это имеет отношение к интроспекции и рефлексии?

Я серьёзно спрашиваю если что.

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

не совсем понятно, зачем мне название ф-ии в дебаге

Мне нужно. Чтобы знать, что функция начала выполняться. Еще иногда пихаю перед return что-нибудь вроде DBG("EOF");, чтобы знать, что функция благополучно завершилась (полезно, когда ищешь "непонятные" ошибки).

какое это имеет отношение к интроспекции и рефлексии?

Это же кулиньксяо!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от nanoolinux

не совсем понятно, зачем мне название ф-ии в дебаге. Я его и так могу посмотреть, зная номер строки.

Верно и обратное: зная только название функции, без номера строки и имени файла, можно при вменяемых логировании и системе именования функций легко найти место, откуда прологировалось. Кроме того, имена функций информативнее: по ним легче ориентироваться в логах. А если надо проанализировать логи от старой версии программы, в которой вызовы логирования сместились из-за изменений в этом файле, то польза от указания названий функций становится ещё очевиднее.

Sorcerer ★★★★★
()

В сишке рефлексию и интроспекцию довольно проблематично сделать, а __func__ это совсем детский лепет. Пришло время посмотреть на Go.

mix_mix ★★★★★
()
Ответ на: комментарий от Sorcerer

Ну блин, я смотрю тут все прямо гуру логирования и дебагинга. Я конечно всё понимаю, но мне обычно хватает штатного rsyslogd :/ Но я это не к тому, что __функ__ не нужен, я к тому, что опять таки, кроме как для дебагинга его применить негде.

nanoolinux ★★★★
()

И да, при чём здесь рефлексия и интроспекция?

theNamelessOne ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.