preprocesor C - __LINE__ i zamiana na string

Odpowiedz Nowy wątek
2011-08-18 15:13
doug
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?

Pozostało 580 znaków

2011-08-18 15:25
doug
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.

Pozostało 580 znaków

2011-08-18 15:37
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


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 2x, ostatnio: MasterBLB, 2011-08-18 15:39

Pozostało 580 znaków

2011-08-18 15:50
doug
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

Pozostało 580 znaków

2011-08-18 15:56
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));

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB, 2011-08-18 15:56

Pozostało 580 znaków

2011-08-18 16:02
0

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


░█░█░█░█░█░█░█░█░█░█░█░
Jak najbardziej da,ale autor koniecznie chce,żeby z tego numeru uzyskiwanego przez _LINE powstał string. - MasterBLB 2011-08-18 16:20
po c... tak dziwnie? - krwq 2011-08-18 16:24
Cóż,to pytanie do autora wątku nie do mnie ;] - MasterBLB 2011-08-18 16:29

Pozostało 580 znaków

2011-08-18 17:07
poczytaj_o_makrach
0
#define S(x) #x
#define TMP(x) S(x)
#define WRITE_LINE std::cout << TMP(__LINE__) << "\n"

może być?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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