Russian Qt Forum

Программирование => С/C++ => Тема начата: kuzulis от Март 26, 2012, 18:20



Название: Gcc. Препроцессор. Контактенация.
Отправлено: kuzulis от Март 26, 2012, 18:20
Всем доброго времени.

Пытаюсь под Gcc компилятор написать макрос типа:

Код
C
...
static const char STR_MODULENAME[] = "Test:";
...
...
#define TRACE(strings) \
{ \
   printf(STR_MODULENAME); \
   printf(__FUNCTION__); \
   printf##strings; \
}
...
 

Но компилятор упорно ругается:
Цитировать
error: pasting "printf" and "(" does not give a valid preprocessing token

Блин. Студийный же компилятор глотает это без проблем.

Мож кто знает как написать аналогичное под GCC ?


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: BRE от Март 26, 2012, 18:25
А ты как это использовать хочешь?
В частности это не совсем понял: printf##strings;


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: V1KT0P от Март 26, 2012, 18:50
Всем доброго времени.

Пытаюсь под Gcc компилятор написать макрос типа:

Код
C
...
static const char STR_MODULENAME[] = "Test:";
...
...
#define TRACE(strings) \
{ \
   printf(STR_MODULENAME); \
   printf(__FUNCTION__); \
   printf##strings; \
}
...
 

Но компилятор упорно ругается:
Цитировать
error: pasting "printf" and "(" does not give a valid preprocessing token

Блин. Студийный же компилятор глотает это без проблем.

Мож кто знает как написать аналогичное под GCC ?
Вот так должно работать:
Код
C
#define TRACE(strings) printf(STR_MODULENAME); printf(__FUNCTION__); printf(strings);
 


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: kuzulis от Март 26, 2012, 19:50
А ты как это использовать хочешь?

Примерно так:

trace.h
Код
C
#ifndef TRACE_H
#define TRACE_H
 
#include <stdio.h>
 
enum {
   INFO_LEVEL = 0x01,
   ERR_LEVEL = 0x02
};
 
int levels = INFO_LEVEL | ERR_LEVEL;
 
 
#define TRACE(level,strings) \
   if ((level) & levels) \
{ \
   printf(STR_MODULENAME); \
   printf(__FUNCTION__); \
   printf##strings; \
}
 
#endif // TRACE_H
 

main.c
Код
C
static const char STR_MODULENAME[] = "Test:";
 
#include <trace.h>
 
int main(int argc, char *argv[])
{
   TRACE(INFO_LEVEL, ("Im is INFO trace %d\n\r", 12345));
 
   return 0;
}
 

Цитировать
В частности это не совсем понял: printf##strings;
должно получится после контактенации для этой записи:
Код
C
printf("Im is INFO trace %d\n\r", 12345);
 


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: kuzulis от Март 26, 2012, 19:54
Цитировать
Вот так должно работать:
Код
C
#define TRACE(strings) printf(STR_MODULENAME); printf(__FUNCTION__); printf(strings);
 

нет, не должно :)


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: kambala от Март 26, 2012, 19:57
может лучше писать по-хорошему, через форматные строки? что-то типа такого:
Код
C++ (Qt)
#define TRACE(format, ...) printf(("%s %s " format), STR_MODULENAME, __FUNCTION__, ##__VA_ARGS__)
но придется явно задавать формат для аргументов


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: V1KT0P от Март 26, 2012, 20:03
Цитировать
Вот так должно работать:
Код
C
#define TRACE(strings) printf(STR_MODULENAME); printf(__FUNCTION__); printf(strings);
 

нет, не должно :)
Тогда объясни что я делаю не так ибо оно у меня работает.


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: kuzulis от Март 26, 2012, 20:07
Цитировать
Тогда объясни что я делаю не так ибо оно у меня работает.
А ты попробуй вывести форматированный вывод.


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: V1KT0P от Март 26, 2012, 20:14
Цитировать
Тогда объясни что я делаю не так ибо оно у меня работает.
А ты попробуй вывести форматированный вывод.
Вот тебе форматированный вывод. Ты конкретнее скажи.


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: kuzulis от Март 26, 2012, 20:31
Цитата: V1KT0P
Вот тебе форматированный вывод. Ты конкретнее скажи.

Ок.
Код
C
TRACE("i'm  trace %d", 123);
 

 :)

Цитата:  kambala
может лучше писать по-хорошему, через форматные строки? что-то типа такого:

Да, вроде так работает. Спасибо.

Пока остановился на таком варианте:

trace.h

Код
C
#ifndef TRACE_H
#define TRACE_H
 
#include <stdio.h>
 
enum {
   INFO_LEVEL = 0x01,
   ERR_LEVEL = 0x02
};
 
int levels = INFO_LEVEL | ERR_LEVEL;
 
#define ENDL "\n\r"
 
#define TRACE(level, format, ...) \
   if ((level) & levels) \
{ \
   printf(("%s:%s: " format), STR_MODULENAME, __FUNCTION__, ##__VA_ARGS__); \
   printf(ENDL); \
}
 
#endif // TRACE_H
 

использование:
Код
C
...
TRACE(INFO_LEVEL, "Im is INFO trace %d %s", 12345, "-string");
...
 

Но хотелось бы конечно чтобы формат при использовании был такой:

Код
C
...
TRACE(INFO_LEVEL, ("Im is INFO trace %d %s", 12345, "-string"));
...
 







Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: V1KT0P от Март 26, 2012, 20:48
Пока остановился на таком варианте:
А почему не хочешь взять готовое: log4qt, log4cpp, log4cplus, log4cxx и т.д.?


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: kuzulis от Март 26, 2012, 20:59
Потому что это для ARM7.


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: kamre от Март 26, 2012, 21:59
Вот тебе форматированный вывод. Ты конкретнее скажи.
На скриншоте парсер в QtCreator не осилил то, что переменная используется внутри макроса и решил ее подчеркнуть в редакторе?


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: V1KT0P от Март 26, 2012, 23:42
Вот тебе форматированный вывод. Ты конкретнее скажи.
На скриншоте парсер в QtCreator не осилил то, что переменная используется внутри макроса и решил ее подчеркнуть в редакторе?
Именно, есть недочеты в парсере, надеюсь кто-то их исправит.


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: kamre от Март 27, 2012, 10:54
Именно, есть недочеты в парсере, надеюсь кто-то их исправит.
Пока свой парсер в QtCreator отстойный, даже с макросами не справляется. Вся надежда на интеграцию с clang, вряд ли они уже свой парсер нормальным сделают.


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: kuzulis от Март 27, 2012, 11:40
А он то подчеркивает, то нет. Если убрать ';', закрыть лист, открыть, добавить снова ';' - то подчеркивание снимается.
Как-то так, шаманство  :)


Название: Re: Gcc. Препроцессор. Контактенация.
Отправлено: mutineer от Март 27, 2012, 11:47
Какое интересное слово в теме - "контактенация"... Это типа "нация людей, живущих вконтакте"?:)