LINUX.ORG.RU

История изменений

Исправление 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=…