LINUX.ORG.RU

Регистрационная печать

 ,


1

1

Сейчас в коде вот так:

#ifdef FUNC_NAME
#undef FUNC_NAME
#endif
#define FUNC_NAME "main(): "

int main(){
	printf(FUNC_NAME "my print");
}

Возможно ли сделать макрос вида:

#define FUNC_NAME __FUNCTION__ "(): "

и не менять вызовы в коде? Цель: не писать перед каждой функцией переопределения FUNC_NAME.



Последнее исправление: xaizek (всего исправлений: 1)
Ответ на: комментарий от alex_grim

Я ничего не понял тебе макросы или на печать?

но как его соединить с "(): "? (желательно не использовать %s)

printf(__func__);printf("();\n");

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от EXL

Вообще такая штука, которую ты как я понял хочешь, обычно делается

#define PRINT(fmt,...) do { \
   fprintf(stderr,"%s %d",__FILE__,__LINE__); \
   fprintf(stderr,__FUNCTION__); \
   /* тут ещё всякое */ \
   fprintf(stderr,fmt ## __VA_ARGS__); \
} while(0)

исторически помнится что так. По многим причинам особенностей ##, +можно делать локальные переменные, и всякие совместимости. Но только не в круглых скобках () , они оператор и оставляют результат.

MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)

Регистрационная печать

Круглая или квадратная?

как его соединить с "(): "? (желательно не использовать %s)

Макросы и конкатенация литералов.

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

Ну можно взять указатель (char*)&__func__ и записать в буфер где уже есть «();» выведя результат на печать как одну строку. Тс попросил вывод строк без %s я ему самый топорный вариант сунул =)

java-разработчик.

Видел жаву только не картинках. И я ваааще не разработчик ни разу я домохозяйка

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от MKuznetsov

Да, ещё следует помнить что в C нет гигиенических макросов.

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

Спамить __FILE__ __LINE__ в каждом логе это круто. Лучше бы про таймстамп подумал. И незачем тут макрос, это всё надо вынести в отдельную функцию

print_log(char const * func, char const * fmt, ...)
и внутри неё уже всё делать, можно её обернуь в макрос чтобы __func__ само подставлялось.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

ЯННП. Как это должно использоваться в коде и что должно делать?

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

Так штоле?

#include <stdio.h>

#define LOG(format, ...) printf("[%s]: " format, __func__, __VA_ARGS__)

int main() {
    LOG("%s\n", "Превед, медвед!");
    return 0;
}
[main]: Превед, медвед!
wandrien ★★
()
Ответ на: Так штоле? от wandrien

Это не будет работать для кода вида:

LOG(«example\n»);

компилятор выдаст ошибку и код не будет собираться если VA_ARGS пустой.

К тому же в коде который привел автор имя функции опционально задается параметром FUNC_NAME и может отсутствовать - а так получается что будет всегда…

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

К тому же в коде который привел автор имя функции опционально задается параметром FUNC_NAME и может отсутствовать - а так получается что будет всегда…

Смысл написания таких макросов обычно как раз в том, чтобы имя было всегда. В ином случае можно просто подставлять __func__ отдельно каждый раз, когда она действительно нужна.

wandrien ★★
()
Ответ на: комментарий от rusproger
printf("%s: %s\n", __func__, "Хочу — ставлю параметр");
printf("%s\n", "Хочу — не ставлю параметр");
printf("%s\n", "Проблема высосана из пальца");
wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от wandrien

А он не хочет переписывать все вызовы в коде и зоопарк и костыли с ручным определением FUNC_NAME не использовать

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