Re[9]: argument list
От: Caracrist https://1pwd.org/
Дата: 24.08.13 20:41
Оценка: 3 (1)
Здравствуйте, cppuser, Вы писали:


C>Esty drugie idei? Mne toje ni takuj nravitsya . No, poka v golovu ne prixodit nichego novogo...


Я же писал

#define TRACE trace

#define M_TRACE_IMPL(format, ...) TRACE("%s:%s:%d: " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define M_TRACE(...) M_TRACE_IMPL("" __VA_ARGS__)

int main()
{
 string s{"string"};
 M_TRACE( "dasdasd num=%u", 78832 );
 M_TRACE( "dasdd str=%s", "dasdsad" );

 return 0;
}
~~~~~
~lol~~
~~~ Single Password Solution
Re[11]: argument list
От: Caracrist https://1pwd.org/
Дата: 25.08.13 07:10
Оценка: 3 (1)
Здравствуйте, cppuser, Вы писали:


C>Kstati, Caracrist, vash kod ne budet rabotaty s odnim argumentom:


C>> M_TRACE( "dasda" );


C>On vse je budet ojidaty 2-argument.


C>Mojno ispolyzovaty tak:


C>> M_TRACE( "%s", "dasda" );


C>No, ...


решение этой проблемы можно совместить с добавлением перехода строки

#define TRACE printf

#define M_TRACE_IMPL(format, ...) TRACE("%s:%s:%d: " format "%s", __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define M_TRACE(...) M_TRACE_IMPL("" __VA_ARGS__, "\n")

int main()
{

 M_TRACE( "dasdasd num=%u", 78832 );
 M_TRACE( "dasdd str=%s", "dasdsad" ); 
 M_TRACE("fdfsd");


 return 0;
}
~~~~~
~lol~~
~~~ Single Password Solution
Re[5]: argument list
От: _smit Россия  
Дата: 24.08.13 16:20
Оценка: +1
Здравствуйте, cppuser, Вы писали:
...
C>int main()
C>{
C> M_TRACE( "dasdasd" );

C> return 0;

C>}

У меня выводит: ../src/trace.h:M_TRACE:58 dasdasd
Если я правильно понимаю назначение M_TRACE, то функция должна была вывести: ../src/test.cpp:main:115 dasdasd
Re[12]: argument list
От: cppuser  
Дата: 26.08.13 04:18
Оценка: +1
Здравствуйте, Caracrist, Вы писали:

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



C>>Kstati, Caracrist, vash kod ne budet rabotaty s odnim argumentom:


C>>> M_TRACE( "dasda" );


C>>On vse je budet ojidaty 2-argument.


C>>Mojno ispolyzovaty tak:


C>>> M_TRACE( "%s", "dasda" );


C>>No, ...


C>решение этой проблемы можно совместить с добавлением перехода строки


C>
C>#define TRACE printf

C>#define M_TRACE_IMPL(format, ...) TRACE("%s:%s:%d: " format "%s", __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
C>#define M_TRACE(...) M_TRACE_IMPL("" __VA_ARGS__, "\n")

C>int main()
C>{

C> M_TRACE( "dasdasd num=%u", 78832 );
C> M_TRACE( "dasdd str=%s", "dasdsad" ); 
C> M_TRACE("fdfsd");


C> return 0;
C>}
C>



Caracrist, интересный обход , и помоему, кавычки в начале define'a не нужны:


#include <cstdio>

#define TRACE printf

#define M_TRACE_IMPL(format, ...) TRACE("%s:%s:%d: " format "%s", __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define M_TRACE(...) M_TRACE_IMPL(__VA_ARGS__, "\n")

int main()
{

M_TRACE( "dasdasd num=%u", 78832 );
M_TRACE( "dasdd str=%s", "dasdsad" );
M_TRACE("fdfsd");


return 0;
}


Вам огромное спасибо!
argument list
От: cppuser  
Дата: 23.08.13 22:03
Оценка:
Всем привет.

Есть definition такой:
#define TRACE(...)
Он пишет логи. Но, к сожалению он только печатает тайм и мессеж, и его нельзя модифицировать.
Я хотел написать враппер к ниму чтобы печатал файл, функцию, и номер лайна. И получилось типо этого:


namespace detail
{

void LogHelper( const char * const file, const char * const function, const int line, const char * const message, ... )
{
va_list arg_list; // 1

va_start( arg_list, message ); // 2

va_end( arg_list ); // 3
}


} // namespace detail

#define M_TRACE(...) detail::LogHelper(__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)



Вот только помоему надо модифицировать arg_list и message. Изменение message'а нетрудно. Но, можно ли добавить 3 аргумента в arg_list...?

Cпасибо!
Re: argument list
От: Caracrist https://1pwd.org/
Дата: 23.08.13 22:50
Оценка:
Здравствуйте, cppuser, Вы писали:

C>Всем привет.


C>Есть definition такой:

C>#define TRACE(...)
C>Он пишет логи. Но, к сожалению он только печатает тайм и мессеж, и его нельзя модифицировать.
C>Я хотел написать враппер к ниму чтобы печатал файл, функцию, и номер лайна.

Попытаюсь угадать как им пользуются....

#define M_TRACE(format, ...) TRACE("File: %s, Function: %s, Line: %d " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: argument list
От: cppuser  
Дата: 24.08.13 00:16
Оценка:
Здравствуйте, Caracrist, Вы писали:

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


C>>Всем привет.


C>>Есть definition такой:

C>>#define TRACE(...)
C>>Он пишет логи. Но, к сожалению он только печатает тайм и мессеж, и его нельзя модифицировать.
C>>Я хотел написать враппер к ниму чтобы печатал файл, функцию, и номер лайна.

C>Попытаюсь угадать как им пользуются....


C>
C>#define M_TRACE(format, ...) TRACE("File: %s, Function: %s, Line: %d " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
C>



Caracrist, спасибо большое за идею.
Re[2]: argument list
От: cppuser  
Дата: 24.08.13 00:30
Оценка:
Здравствуйте, Caracrist, Вы писали:

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


C>>Всем привет.


C>>Есть definition такой:

C>>#define TRACE(...)
C>>Он пишет логи. Но, к сожалению он только печатает тайм и мессеж, и его нельзя модифицировать.
C>>Я хотел написать враппер к ниму чтобы печатал файл, функцию, и номер лайна.

C>Попытаюсь угадать как им пользуются....


C>
C>#define M_TRACE(format, ...) TRACE("File: %s, Function: %s, Line: %d " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
C>



Есть одна недоделанная вещь. Надо определить не
C> M_TRACE(format, ...)
a
C> M_TRACE(...)
так как M_TRACE(format, ...) будет всегда ожидать 1-аргумент.
Re[3]: argument list
От: _smit Россия  
Дата: 24.08.13 08:34
Оценка:
Здравствуйте, cppuser, Вы писали:

C>>>Есть definition такой:

C>>>#define TRACE(...)
C>>>Он пишет логи. Но, к сожалению он только печатает тайм и мессеж, и его нельзя модифицировать.
C>>>Я хотел написать враппер к ниму чтобы печатал файл, функцию, и номер лайна.

C>>
C>>#define M_TRACE(format, ...) TRACE("File: %s, Function: %s, Line: %d " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
C>>


C>Есть одна недоделанная вещь. Надо определить не

C>> M_TRACE(format, ...)
C>a
C>> M_TRACE(...)
C>так как M_TRACE(format, ...) будет всегда ожидать 1-аргумент.

Если так попробовать:

// file trace.h
#ifndef TRACE_H_
#define TRACE_H_

#define TRACE(...) std::cout << "test, must be yous code!" << std::endl;

constexpr struct Trace
{
    template <typename ...Args>
    void operator()(Args...) const {TRACE(Args);}
} M_TRACE;

#endif /* TRACE_H_ */


// file main.cpp
#include "trace.h"

void main
{
  M_TRACE(1);
  M_TRACE();
  M_TRACE(1,2);
}


потребуется флаг (-std=c++0x) или (-std=c++11)
Re[4]: argument list
От: _smit Россия  
Дата: 24.08.13 08:47
Оценка:
Здравствуйте, _smit, Вы писали:


_>Если так попробовать:


_>[c]


_>constexpr struct Trace

_>{
_> template <typename ...Args>
_> void operator()(Args...) const {TRACE(Args);}
_>} M_TRACE;

_>потребуется флаг (-std=c++0x) или (-std=c++11)


прошу прощения, идею высказал, но изложил код некорректно, сейчас подправлю шаблон Trace... (может кто опередит?)
Re[5]: argument list
От: _smit Россия  
Дата: 24.08.13 09:02
Оценка:
Здравствуйте, _smit, Вы писали:

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



_>>Если так попробовать:


_>>

_>>constexpr struct Trace
_>>{
_>>    template <typename ...Args>
_>>    void operator()(Args...) const {TRACE(Args);}
_>>} M_TRACE;

_>>потребуется флаг (-std=c++0x) или (-std=c++11)

_>прошу прощения, идею высказал, но изложил код некорректно, сейчас подправлю шаблон Trace... (может кто опередит?)

Если не ошибаюсь, то надо так записать:
[c]
constexpr struct Trace
{
   template <typename ...Args>
   void operator()(Args ...x) const
   {
      TRACE(x...);
   }
} M_TRACE;
Re[3]: argument list
От: Caracrist https://1pwd.org/
Дата: 24.08.13 11:43
Оценка:
Здравствуйте, cppuser, Вы писали:


C>Есть одна недоделанная вещь. Надо определить не

C>> M_TRACE(format, ...)
C>a
C>> M_TRACE(...)
C>так как M_TRACE(format, ...) будет всегда ожидать 1-аргумент.


#define M_TRACE_IMPL(format, ...) TRACE("File: %s, Function: %s, Line: %d " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define M_TRACE(...) M_TRACE_IMPL("" __VA_ARGS__)
~~~~~
~lol~~
~~~ Single Password Solution
Re[4]: argument list
От: cppuser  
Дата: 24.08.13 15:03
Оценка:
Здравствуйте, Caracrist, Вы писали:

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



C>>Есть одна недоделанная вещь. Надо определить не

C>>> M_TRACE(format, ...)
C>>a
C>>> M_TRACE(...)
C>>так как M_TRACE(format, ...) будет всегда ожидать 1-аргумент.


C>
C>#define M_TRACE_IMPL(format, ...) TRACE("File: %s, Function: %s, Line: %d " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
C>#define M_TRACE(...) M_TRACE_IMPL("" __VA_ARGS__)
C>



Всем огромное спасибо за классные идеи.
Вот код, которого я добивался:


#include <iostream>
#include <cstdarg>
#include <string>

using namespace std;

#define TRACE(...) trace(__VA_ARGS__)

void trace( const char * const message, ...)
{
va_list arg_list;

char buffer[500] = {0};

va_start( arg_list, message );

vprintf( message, arg_list );

va_end( arg_list );
}

template <class First, class... Rest>
void M_TRACE(First first, Rest... rest)
{
string s = string("%s:%s:%d ") + string(first);
TRACE( s.c_str(), __FILE__, __FUNCTION__, __LINE__, rest...);
}

int main()
{
M_TRACE( "dasdasd" );

return 0;
}
Re[6]: argument list
От: cppuser  
Дата: 24.08.13 19:42
Оценка:
Здравствуйте, _smit, Вы писали:

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

_>...
C>>int main()
C>>{
C>> M_TRACE( "dasdasd" );

C>> return 0;

C>>}

_>У меня выводит: ../src/trace.h:M_TRACE:58 dasdasd

_>Если я правильно понимаю назначение M_TRACE, то функция должна была вывести: ../src/test.cpp:main:115 dasdasd


Da, vi pravi. Ya pospeshil s vivodami
Re[6]: argument list
От: cppuser  
Дата: 24.08.13 19:50
Оценка:
Здравствуйте, _smit, Вы писали:

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

_>...
C>>int main()
C>>{
C>> M_TRACE( "dasdasd" );

C>> return 0;

C>>}

_>У меня выводит: ../src/trace.h:M_TRACE:58 dasdasd

_>Если я правильно понимаю назначение M_TRACE, то функция должна была вывести: ../src/test.cpp:main:115 dasdasd





#include <iostream>
#include <cstdarg>
#include <string>

using namespace std;

#define TRACE(...) trace(__VA_ARGS__)

void trace( const char * const message, ...)
{
va_list arg_list;

va_start( arg_list, message );

vprintf( message, arg_list );

va_end( arg_list );
}

template <class First, class Second, class Third, class Fourth, class Fifth, class... Rest>
void M_TRACE(First first, Second second, Third third, Fourth fourth, Fifth fifth, Rest... rest)
{
string s = string(first) + string(fifth) + string("\n");
TRACE( s.c_str(), second, third, fourth, rest...);
}

#define N_TRACE(...) M_TRACE( "%s:%s:%d: ", __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__ )

int main()
{
string s{"string"};
N_TRACE( "dasdasd num=%u", 78832 );
N_TRACE( "dasdd str=%s", "dasdsad" );

return 0;
}
Re[6]: argument list
От: cppuser  
Дата: 24.08.13 19:58
Оценка:
Здравствуйте, _smit, Вы писали:

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

_>...
C>>int main()
C>>{
C>> M_TRACE( "dasdasd" );

C>> return 0;

C>>}

_>У меня выводит: ../src/trace.h:M_TRACE:58 dasdasd

_>Если я правильно понимаю назначение M_TRACE, то функция должна была вывести: ../src/test.cpp:main:115 dasdasd


Да, вы правы. Вот это помоему, рабочий код:

#include <iostream>
#include <cstdarg>
#include <string>

using namespace std;

#define TRACE(...) trace(__VA_ARGS__)

void trace( const char * const message, ...)
{
va_list arg_list;

va_start( arg_list, message );

vprintf( message, arg_list );

va_end( arg_list );
}

template <class First, class Second, class Third, class Fourth, class Fifth, class... Rest>
void M_TRACE(First first, Second second, Third third, Fourth fourth, Fifth fifth, Rest... rest)
{
string s = string(first) + string(fifth) + string("\n");
TRACE( s.c_str(), second, third, fourth, rest...);
}

#define N_TRACE(...) M_TRACE( "%s:%s:%d: ", __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__ )

int main()
{
string s{"string"};
N_TRACE( "dasdasd num=%u", 78832 );
N_TRACE( "dasdd str=%s", "dasdsad" );

return 0;
}
Re[7]: argument list
От: Caracrist https://1pwd.org/
Дата: 24.08.13 20:34
Оценка:
Здравствуйте, cppuser, Вы писали:

C> string s = string(first) + string(fifth) + string("\n");


Это сильно ограничивает применимость (например нельзя трейсить из аллокатора) и просто ужасно по производительности.
~~~~~
~lol~~
~~~ Single Password Solution
Re[8]: argument list
От: cppuser  
Дата: 24.08.13 20:37
Оценка:
Здравствуйте, Caracrist, Вы писали:

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


C>> string s = string(first) + string(fifth) + string("\n");


C>Это сильно ограничивает применимость (например нельзя трейсить из аллокатора) и просто ужасно по производительности.



Esty drugie idei? Mne toje ni takuj nravitsya . No, poka v golovu ne prixodit nichego novogo...
Re[8]: argument list
От: cppuser  
Дата: 24.08.13 20:44
Оценка:
Здравствуйте, Caracrist, Вы писали:

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


C>> string s = string(first) + string(fifth) + string("\n");


C>Это сильно ограничивает применимость (например нельзя трейсить из аллокатора) и просто ужасно по производительности.



Было б круто, если б можно было все только с define'ами провернуть...
Re[10]: argument list
От: cppuser  
Дата: 24.08.13 20:49
Оценка:
Здравствуйте, Caracrist, Вы писали:

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



C>>Esty drugie idei? Mne toje ni takuj nravitsya . No, poka v golovu ne prixodit nichego novogo...


C>Я же писал


C>
C>#define TRACE trace

C>#define M_TRACE_IMPL(format, ...) TRACE("%s:%s:%d: " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
C>#define M_TRACE(...) M_TRACE_IMPL("" __VA_ARGS__)

C>int main()
C>{
C> string s{"string"};
C> M_TRACE( "dasdasd num=%u", 78832 );
C> M_TRACE( "dasdd str=%s", "dasdsad" );

C> return 0;
C>}
C>



Sorry, u menya pochemuto v proshliy raz vash kod ne srabotal .
Re[10]: argument list
От: cppuser  
Дата: 24.08.13 21:29
Оценка:
Здравствуйте, Caracrist, Вы писали:

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



C>>Esty drugie idei? Mne toje ni takuj nravitsya . No, poka v golovu ne prixodit nichego novogo...


C>Я же писал


C>
C>#define TRACE trace

C>#define M_TRACE_IMPL(format, ...) TRACE("%s:%s:%d: " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
C>#define M_TRACE(...) M_TRACE_IMPL("" __VA_ARGS__)

C>int main()
C>{
C> string s{"string"};
C> M_TRACE( "dasdasd num=%u", 78832 );
C> M_TRACE( "dasdd str=%s", "dasdsad" );

C> return 0;
C>}
C>



Kstati, Caracrist, vash kod ne budet rabotaty s odnim argumentom:

C> M_TRACE( "dasda" );


On vse je budet ojidaty 2-argument.

Mojno ispolyzovaty tak:

C> M_TRACE( "%s", "dasda" );


No, ...
Re[11]: argument list
От: Caracrist https://1pwd.org/
Дата: 25.08.13 07:15
Оценка:
Здравствуйте, cppuser, Вы писали:


C>>>Esty drugie idei? Mne toje ni takuj nravitsya . No, poka v golovu ne prixodit nichego novogo...

C>Kstati, Caracrist, vash kod ne budet rabotaty s odnim argumentom:
C>On vse je budet ojidaty 2-argument.
C>Mojno ispolyzovaty tak:
C>No, ...

у меня на работе тоже нет русской клавиатуры, и по этому я пишу вот тут:

http://translate.google.com/#ru/en/
~~~~~
~lol~~
~~~ Single Password Solution
Re[12]: argument list
От: cppuser  
Дата: 26.08.13 04:12
Оценка:
Здравствуйте, Caracrist, Вы писали:

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



C>>>>Esty drugie idei? Mne toje ni takuj nravitsya . No, poka v golovu ne prixodit nichego novogo...

C>>Kstati, Caracrist, vash kod ne budet rabotaty s odnim argumentom:
C>>On vse je budet ojidaty 2-argument.
C>>Mojno ispolyzovaty tak:
C>>No, ...

C>у меня на работе тоже нет русской клавиатуры, и по этому я пишу вот тут:


C>http://translate.google.com/#ru/en/



спасибо за идею
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.