Russian Qt Forum
Ноябрь 23, 2024, 15:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Gcc. Препроцессор. Контактенация.  (Прочитано 10636 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Март 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 ?
« Последнее редактирование: Март 26, 2012, 18:21 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #1 : Март 26, 2012, 18:25 »

А ты как это использовать хочешь?
В частности это не совсем понял: printf##strings;
Записан
V1KT0P
Гость
« Ответ #2 : Март 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);
 
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Март 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);
 
« Последнее редактирование: Март 26, 2012, 19:52 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Март 26, 2012, 19:54 »

Цитировать
Вот так должно работать:
Код
C
#define TRACE(strings) printf(STR_MODULENAME); printf(__FUNCTION__); printf(strings);
 

нет, не должно Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Март 26, 2012, 19:57 »

может лучше писать по-хорошему, через форматные строки? что-то типа такого:
Код
C++ (Qt)
#define TRACE(format, ...) printf(("%s %s " format), STR_MODULENAME, __FUNCTION__, ##__VA_ARGS__)
но придется явно задавать формат для аргументов
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
V1KT0P
Гость
« Ответ #6 : Март 26, 2012, 20:03 »

Цитировать
Вот так должно работать:
Код
C
#define TRACE(strings) printf(STR_MODULENAME); printf(__FUNCTION__); printf(strings);
 

нет, не должно Улыбающийся
Тогда объясни что я делаю не так ибо оно у меня работает.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #7 : Март 26, 2012, 20:07 »

Цитировать
Тогда объясни что я делаю не так ибо оно у меня работает.
А ты попробуй вывести форматированный вывод.
Записан

ArchLinux x86_64 / Win10 64 bit
V1KT0P
Гость
« Ответ #8 : Март 26, 2012, 20:14 »

Цитировать
Тогда объясни что я делаю не так ибо оно у меня работает.
А ты попробуй вывести форматированный вывод.
Вот тебе форматированный вывод. Ты конкретнее скажи.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #9 : Март 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"));
...
 





Записан

ArchLinux x86_64 / Win10 64 bit
V1KT0P
Гость
« Ответ #10 : Март 26, 2012, 20:48 »

Пока остановился на таком варианте:
А почему не хочешь взять готовое: log4qt, log4cpp, log4cplus, log4cxx и т.д.?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #11 : Март 26, 2012, 20:59 »

Потому что это для ARM7.
Записан

ArchLinux x86_64 / Win10 64 bit
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #12 : Март 26, 2012, 21:59 »

Вот тебе форматированный вывод. Ты конкретнее скажи.
На скриншоте парсер в QtCreator не осилил то, что переменная используется внутри макроса и решил ее подчеркнуть в редакторе?
Записан
V1KT0P
Гость
« Ответ #13 : Март 26, 2012, 23:42 »

Вот тебе форматированный вывод. Ты конкретнее скажи.
На скриншоте парсер в QtCreator не осилил то, что переменная используется внутри макроса и решил ее подчеркнуть в редакторе?
Именно, есть недочеты в парсере, надеюсь кто-то их исправит.
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #14 : Март 27, 2012, 10:54 »

Именно, есть недочеты в парсере, надеюсь кто-то их исправит.
Пока свой парсер в QtCreator отстойный, даже с макросами не справляется. Вся надежда на интеграцию с clang, вряд ли они уже свой парсер нормальным сделают.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 22.