История изменений
Исправление AntonI, (текущая версия) :
Рыбак рыбака… вот подарок, это лучше принтфов:
//--------------------------------------------------------------------------
struct SplitArgForOut{
int end, next;
SplitArgForOut(const char *str){
const char *br = "()[]{}"; int brc[3] = {0, 0, 0};
for(end=0; str[end] && (brc[0] || brc[1] || brc[2] || str[end]!=','); ++end)
for(int k=0; k<6; ++k) if(str[end]==br[k]){ brc[k/2] += 1-k%2*2; break; }
next = str[end]?end+1:end; while(str[next] && (str[next]==' ' || str[next]=='\t')) next++;
}
};
//--------------------------------------------------------------------------
inline void debug_out(std::ostream&, const char*){}
template <typename T, typename ... Args> void debug_out(std::ostream& out, const char* str, T x, Args ... args){
SplitArgForOut key(str);
if(str[0]!='"'){ out.write(str, key.end); out<<"="; }
out<<x; if(sizeof...(Args)>0) out<<", ";
debug_out(out, str+key.next, args...);
}
//--------------------------------------------------------------------------
#define WMSG(args...) { std::cerr<<"#"<<__FILE__<<" "<<__FUNCTION__<<"() "<<__LINE__<<": "; \
debug_out(std::cerr, #args, args); std::cerr<<"\n"; }
юзать так
WMSG(a, b, a+b); // любое число аргументов
выводит файл, функцию, номер строки и дальше значения аргументов в виде a=…, b=…, a+b=…
Исходная версия AntonI, :
Рыбак рыбака… вот подарок, это лучше принтфов:
//--------------------------------------------------------------------------
struct SplitArgForOut{
int end, next;
SplitArgForOut(const char *str){
const char *br = "()[]{}"; int brc[3] = {0, 0, 0};
for(end=0; str[end] && (brc[0] || brc[1] || brc[2] || str[end]!=','); ++end)
for(int k=0; k<6; ++k) if(str[end]==br[k]){ brc[k/2] += 1-k%2*2; break; }
next = str[end]?end+1:end; while(str[next] && (str[next]==' ' || str[next]=='\t')) next++;
}
};
//--------------------------------------------------------------------------
inline void debug_out(std::ostream&, const char*){}
template <typename T, typename ... Args> void debug_out(std::ostream& out, const char* str, T x, Args ... args){
SplitArgForOut key(str);
if(str[0]!='"'){ out.write(str, key.end); out<<"="; }
out<<x; if(sizeof...(Args)>0) out<<", ";
debug_out(out, str+key.next, args...);
}
//--------------------------------------------------------------------------
#define WMSG(args...) { std::cerr<<"#"<<__FILE__<<" "<<__FUNCTION__<<"() "<<__LINE__<<": "; \
aiw::debug_out(std::cerr, #args, args); std::cerr<<"\n"; }
юзать так
WMSG(a, b, a+b); // любое число аргументов
выводит файл, функцию, номер строки и дальше значения аргументов в виде a=…, b=…, a+b=…