preprocesor C - __LINE__ i zamiana na string

0

mam sobie parę makropotworków:

#define S(x) #x
#define WRITE_LINE std::cout<<S(__LINE__)<<"\n"

pierwsze makro zamienia "cokolwiek" na napis jeśli napiszę gdzieś w kodzie:

printf("%s\n",S(4));

to dostanę:4

drugie makro ma zamiar wypisywać numer linii. ale jeśli napiszę w 8 linijce kodu:

WRITE_LINE;

to zamiast dostać8dostaję__LINE__ - czyli po prostu otacza mi nawiasami LINE i tyle.

jak to zrobić poprawnie?

0

może wyraziłem się nieprecyzyjnie. nie chodzi mi o proste wypisanie numeru linii, bo to jest łatwe:

#define WRITE(x) std::cout<<S(x)<<": "<<(x)<<"\n" ;

ale chodzi mi aby w wyniku działania makra bezparametrowego dostać łańcuch znaków zawierający numer linii.

0

spróbuj tak:

char t[enough_space_for_digit];
t[last]=0;
std::string s(itoa(__LINE__,&t));

więcej na http://www.cplusplus.com

0

dzieki, ale tak się nie da, nie o to chodzi.

obszedłem to:

//h:
class Reporter
{
	public:
		Reporter(const char *name) ;
		Reporter(const char *funcName, int lineNumber, const char *fileName) ;
		~Reporter() ; //not virtual
	protected:
		std::string getName()const ;
	private:
		const std::string nameOfBlock ;
		
		const std::string createNameOfBlock(const char *funcName, int lineNumber, const char *fileName) ;
};
inline std::string Reporter::getName()const
{
	return nameOfBlock;
}
#define REPORTER(x) RROut::Reporter x((__func__),(__LINE__),(__FILE__))

//cpp:
Reporter::Reporter(const char *name):nameOfBlock(name)
{
	rrout<<nameOfBlock<<" BEGIN\n" ;
}

Reporter::Reporter(const char *funcName, int lineNumber, const char *fileName):
			nameOfBlock(createNameOfBlock(funcName,lineNumber,fileName))
{
	rrout<<nameOfBlock<<" BEGIN\n" ;
}

Reporter::~Reporter()
{
	rrout<<nameOfBlock<<" END\n" ;
}

const std::string Reporter::createNameOfBlock(const char *funcName, int lineNumber, const char *fileName) 
{
	std::ostringstream oss ;
	oss<<funcName<<", line "<<lineNumber<<" in "<<fileName;
	return oss.str() ;
}

działa to tak, że jeśli napiszę:

#include <iostream>
#include "reporter.h"

void fun(int a)
{
    REPORTER(nazwajakas) ;
    std::cout<<"a == "<<a<<"\n" ;
}

int main(int argc, char **argv)
{
    REPORTER(repMain) ;
    fun(6);
    fun(0);

    return 0 ;
}

to dostaję:

main, line 12 in p3_4p.cpp BEGIN
fun, line 6 in p3_4p.cpp BEGIN
a == 6
fun, line 6 in p3_4p.cpp END
fun, line 6 in p3_4p.cpp BEGIN
a == 0
fun, line 6 in p3_4p.cpp END
main, line 12 in p3_4p.cpp END

a chciałbym nie tworzyć tego konstruktora z 3 argumentami w klasie Reporter, tylko zostawić 1 argumentowy przyjmujący tylko nazwę, a cała składnia "funkja, line xxx in plik.cpp" miałaby być tworzona przez makro. jak ktoś wie jak to zrobić, to wielkie dzięki

pozdrawiam

0

Jak się nie da jak się da?Kopsnąłem się tylko w podawaniu argumentów,a tak to działa:

	char t[10];
	t[9]=0;
	std::string s(itoa(__LINE__,t,10));
0

a nie da się po prostu:
#define WRITE_LINE std::cout<<__LINE__<<"\n"

0
#define S(x) #x
#define TMP(x) S(x)
#define WRITE_LINE std::cout << TMP(__LINE__) << "\n"

może być?

1 użytkowników online, w tym zalogowanych: 0, gości: 1