trace реализация
От: Magister Россия  
Дата: 29.11.03 11:36
Оценка:
Привет,

возникла проблемка,
следующий код :


template<const char* __file, int __line>
void ___my_trace(const char* p_Format, ...)
{
    ...
}


#ifdef _DEBUG
    #define trace ___my_trace<__FILE__, __LINE__>
#else
    #define trace 
#endif


не компилируется при вызове

trace("this is test message %d", 100);



Compiling...
Logger.cpp
... : error C2973: '___my_trace' : invalid template argument '__file'
... : see declaration of '___dfl_trace'
... : error C2973: '___my_trace' : invalid template argument '__line'
... : see declaration of '___dfl_trace'
Error executing cl.exe.


может я пересидел сегодня и чтото пропустил, вот пишу это сообщение и иду спать
спасибо за содействие.
Re: trace реализация
От: adontz Грузия http://adontz.wordpress.com/
Дата: 29.11.03 13:36
Оценка:
Здравствуйте, Magister, Вы писали:
А макрос Trace больше нигде не определён?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: trace реализация
От: konst  
Дата: 29.11.03 13:47
Оценка: 2 (1)
можно для начала вопрос: зачем темплейтом делать!? почему не явными параметрами эти строку и файл? вроде компилятор должен нагенерить кучу реализаций или я что-то не так понимаю...
возможно примерно так (не проверял):
void trace(int line, const char* file, const char* fmt, ...);
#ifdef _DEBUG
#define TRACE(__fmt, __x) trace(__LINE__, __FILE__, __fmt, __x)
#else
#define TRACE
#endif
// далее в коде
TRACE("trace %d %f %s", (10, 1.1, "aaa"));
Re: trace реализация
От: Павел Кузнецов  
Дата: 29.11.03 15:22
Оценка:
Здравствуйте, Magister, Вы писали:

M>
 M> template<const char* __file, int __line>
 M> void ___my_trace(const char* p_Format, ...);

 M> #ifdef _DEBUG
 M>     #define trace ___my_trace<__FILE__, __LINE__>
 M>


Строковый литерал не может являться аргументом шаблона, т.к. аргументы
шаблона должны иметь внешнее связывание.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: trace реализация
От: Magister Россия  
Дата: 30.11.03 09:47
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Magister, Вы писали:

A>А макрос Trace больше нигде не определён?

нет

для уверенности стоит

#undef trace
Re[2]: trace реализация
От: Magister Россия  
Дата: 30.11.03 10:03
Оценка:
Здравствуйте, konst, Вы писали:

K>можно для начала вопрос: зачем темплейтом делать!? почему не явными параметрами эти строку и файл? вроде компилятор должен нагенерить кучу реализаций или я что-то не так понимаю...

K>возможно примерно так (не проверял):
K>
K>void trace(int line, const char* file, const char* fmt, ...);
K>#ifdef _DEBUG
K>#define TRACE(__fmt, __x) trace(__LINE__, __FILE__, __fmt, __x)
K>#else
K>#define TRACE
K>#endif
K>// далее в коде
K>TRACE("trace %d %f %s", (10, 1.1, "aaa"));
K>


спасибо, о том чтобы в скобочки взять параметры я и не подумал,
только вот недостаток такой реализации в том, что нелья вызвать просто

TRACE("trace");


только если

#ifdef _DEBUG
#define TRACE(__multiparam) trace(__LINE__, __FILE__, __multiparam)
#else
#define TRACE
#endif

тогда прокатывает

TRACE(("trace %d %f %s", 10, 1.1, "aaa"));

и

TRACE(("trace"));


но вот както не красиво выходит, приходится пользовать двойные скобки
Re[2]: trace реализация
От: Magister Россия  
Дата: 30.11.03 10:05
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, Magister, Вы писали:


M>>
 M>> template<const char* __file, int __line>
 M>> void ___my_trace(const char* p_Format, ...);

 M>> #ifdef _DEBUG
 M>>     #define trace ___my_trace<__FILE__, __LINE__>
 M>>


ПК>Строковый литерал не может являться аргументом шаблона, т.к. аргументы

ПК>шаблона должны иметь внешнее связывание.

а что есть внешнее связывание?
Re[3]: trace реализация
От: Павел Кузнецов  
Дата: 30.11.03 11:49
Оценка:
Здравствуйте, Magister, Вы писали:

ПК>>Строковый литерал не может являться аргументом шаблона, т.к. аргументы

ПК>>шаблона должны иметь внешнее связывание.

M>а что есть внешнее связывание?


http://rsdn.ru/search/?q=%E2%ED%E5%F8%ED%E5%E5+%F1%E2%FF%E7%FB%E2%E0%ED%E8%E5+%7C+linkage+%F8%E0%E1%EB%EE%ED%FB&amp;mode=rank&amp;group=9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: trace реализация
От: ssi Россия  
Дата: 30.11.03 12:05
Оценка:
Здравствуйте, Magister, Вы писали:

M>Привет,


M>возникла проблемка,

M>следующий код :

M>[ccode]

M>template<const char* __file, int __line>
M>void ___my_trace(const char* p_Format, ...)
M>{
M> ...
M>}

>не компилируется при вызове


Цитата из "Шаблоны C++: справочник разработчика" стр. 62:

На параметры шаблонов, не являющиеся типами, накладываются некоторые ограничения. В общем случае такими параметрами могут быть только целочисленные константы (включая перечисления) или указатели на объекты с внешним связыванием.

...Поскольку строковые литералы — это объекты с внутренним связыванием (два строковых литерала, которые имеют одинаковые значения, но находятся в разных модулях, являются разными объектами), их использование в качестве аргументов шаблона не допускается.
Знающие не говорят, говорящие не знают. Лао Цзы
Re: trace реализация
От: e-Xecutor Россия  
Дата: 01.12.03 05:04
Оценка:
Здравствуйте, Magister, Вы писали:

[skip]

Почему не компиляется, тебе Павел уже написал.

Про то как это можно реализовать с минимумом затрат:

class Tracer{
public:
  Tracer(const char* f,int l):file(f),line(l){}
  void Trace(const char* fmt,...)
  {
    // log output
  }
protected:
  const char* file;
  int line;
};

#ifdef DEBUG
#define TRACE Tracer(__FILE__,__LINE__).Trace
#else
#define TRACE if(true);else Tracer(__FILE__,__LINE__).Trace
#endif
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.