Препроцессор и переменное число аргументов
От: vnechiporenko  
Дата: 18.08.05 06:50
Оценка:
Суть проблеммы вначале заключалась в том что бы писать форматированный вывод printfа помимо как в OUTPUT еще и в лог файл.

1) Сначала я хотел сделать это через функцию которая вызывает и fprint и printf, но обнаружил что чтобы это сделать необходимо определить число передаваемых параметров и их типы по строке форматирования... в итоге был напсин код на асме который успешно сохраняет кусочек стека в heapе а потом шаманит с указателем стека и вызывает printf и fprint. Все бы нечиго, я даже заделал макрос, который генерит соответсвующие asmные вставки, но по каким то причинам слово Assembler кроме меня никому не греет душу

2) Возникла идея, что раз нельзя что бы функция ето все тварила, то пусть хотя бы макрос, что ему стоит строчке в тексте слепить, но обнаружилось что препроцессор C++ такой ущербный язык, что кажется его таким сделал специально — 'ибо нефиг' . В результате нескольких попыток, был получен слегка корявый вариант, который все таки слепляет агрументы из двух списков для функции с переменным числом агрументов:

// Бубен :)
#define __AST *
#define Cc __AST/  //Comment Close
#define Co /__AST  //Comment Open
#define _FUNCCALL(func, h, t) func(Co h Cc, Co t Cc)
// Конец Бубна

// Целывой макрос
FILE* logFile = 0;
#define LOGPRINT(x) \
   printf##x; \
   if (logFile) _FUNCCALL(fprintf, (Cc logFile Co), x);

// Используется как
LOGPRINT((Cc "Error code: %d. Error Message: %s\r\n", errCode, errMsg Co))


ВОПРОС: Есть у кого идеи как всетаки сделать макрос LOGPRINT чтобы его можно было записать:
LOGPRINT(("Error code: %d. Error Message: %s\r\n", errCode, errMsg)), т.е. без Cc и Co.
а то не красиво смотрится

Кто подскажеть тому



18.08.05 11:38: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.