C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

__func__ macro emulation

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++)
View previous topic :: View next topic  
Author Message
chasdev
Guest





PostPosted: Mon Oct 27, 2003 9:42 am    Post subject: __func__ macro emulation Reply with quote




I'm using a preprocessor/compiler (HP aCC) that doesn't support the
__func__ macro (a la gcc: expands to the name of the enclosing
function). I've thought about using an extra preprocessing step, writing
a parser, etc but this seems like way too much work. Has anyone tried
this before? Any suggestions welcome!


--
Posted via http://dbforums.com
Back to top
Pavel Vozenilek
Guest





PostPosted: Mon Oct 27, 2003 10:20 pm    Post subject: Re: __func__ macro emulation Reply with quote



chasdev <member45782 (AT) dbforums (DOT) com> wrote

Quote:
I'm using a preprocessor/compiler (HP aCC) that doesn't support the
__func__ macro (a la gcc: expands to the name of the enclosing
function). I've thought about using an extra preprocessing step, writing
a parser, etc but this seems like way too much work. Has anyone tried
this before? Any suggestions welcome!

aCC should use __FUNCTION__.


You may take look on file boost/current_function.hpp from Boost
distribution, it contains macro expanded properly under many
compilers.

/Pavel

Back to top
Samuele Armondi
Guest





PostPosted: Wed Oct 29, 2003 10:23 pm    Post subject: Re: __func__ macro emulation Reply with quote



chasdev wrote:

Quote:

I'm using a preprocessor/compiler (HP aCC) that doesn't support the
__func__ macro (a la gcc: expands to the name of the enclosing
function). I've thought about using an extra preprocessing step, writing
a parser, etc but this seems like way too much work. Has anyone tried
this before? Any suggestions welcome!


--
Posted via http://dbforums.com

Maybe you could manually keep track of the current function, i.e:

#include <vector>
#include <string>
#include <iostream>

class FunctionTracer
{
private:
std::vector<std::string> Trace;
int MaxSteps;
public:
FunctionTracer(int);
void EnterFunction(const std::string&);
void LeaveFunction(const std::string&);
void SetMaxSteps(int);
void Reset();
};

FunctionTracer::FunctionTracer(int n) : MaxSteps(n)
{
Trace.clear();
Trace.reserve(MaxSteps);
}

void FunctionTracer::EnterFunction(const std::string& s)
{
if (Trace.size() == MaxSteps)
Trace.clear();
Trace.push-back(s);
}

void FunctionTracer::LeaveFunction(const std::string& s)
{
if (Trace.back() == s) // the function we are leaving will be th
e last one we entered
Trace.pop_back();
else
; // error!
}

void SetMaxSteps(int n)
{std::cout << ft.CurrentFunction();
if (MaxSteps != n)
{
MaxSteps = n;
Trace.reserve(MaxSteps);
}
}

void Reset()
{
Trace.clear();
}

//test it

FunctionTracer ft(10);

void f1()
{
ft.EnterFunction("f1");
std::cout << "in function 1n";
ft.LeaveFunction("f1");
}
void f2()
{
ft.EnterFunction("f2");
std::cout << "in function2n";
ft.LeaveFunction("f2");
}

int main()
{
ft.EnterFunction("main");
f1();
std::cout << ft.CurrentFunction();
f2();
std::cout << ft.CurrentFunction();
}

This is untested code, I just wrote as it came...so don't blame me if its
broken and buggy (as it probaly will be!). I hope it helps anyway.
S. Armondi


Back to top
Samuele Armondi
Guest





PostPosted: Thu Oct 30, 2003 10:25 am    Post subject: Re: __func__ macro emulation Reply with quote


"Samuele Armondi" <armondolo (AT) yahoo (DOT) co.uk> wrote

Quote:
chasdev wrote:


I'm using a preprocessor/compiler (HP aCC) that doesn't support the
__func__ macro (a la gcc: expands to the name of the enclosing
function). I've thought about using an extra preprocessing step, writing
a parser, etc but this seems like way too much work. Has anyone tried
this before? Any suggestions welcome!


--
Posted via http://dbforums.com

Maybe you could manually keep track of the current function, i.e:

#include <vector
#include #include
class FunctionTracer
{
snip
std::cout << ft.CurrentFunction();
}

This is untested code, I just wrote as it came...so don't blame me if its
broken and buggy (as it probaly will be!). I hope it helps anyway.
S. Armondi

Sorry, I forgot to add the CurrentFunction() code... the code should look

like this:

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

class FunctionTracer
{
private:
std::vector<std::string> Trace;
int MaxSteps;
public:
FunctionTracer(int);
void EnterFunction(const std::string&);
void LeaveFunction(const std::string&);
void SetMaxSteps(int);
void Reset();
const std::string& CurrentFunction();
};

FunctionTracer::FunctionTracer(int n) : MaxSteps(n)
{
Trace.clear();
Trace.reserve(MaxSteps);
}

void FunctionTracer::EnterFunction(const std::string& s)
{
if (Trace.size() == MaxSteps)
Trace.clear();
Trace.push-back(s);
}

void FunctionTracer::LeaveFunction(const std::string& s)
{
if (Trace.back() == s) // the function we are leaving will
be th
e last one we entered
Trace.pop_back();
else
; // error!
}

void SetMaxSteps(int n)
{std::cout << ft.CurrentFunction();
if (MaxSteps != n)
{
MaxSteps = n;
Trace.reserve(MaxSteps);
}
}

void Reset()
{
Trace.clear();
}

const std::string& CurrentFunction()
{
return Trace.back();
}

//test it

FunctionTracer ft(10);

void f1()
{
ft.EnterFunction("f1");
std::cout << "in function 1n";
ft.LeaveFunction("f1");
}
void f2()
{
ft.EnterFunction("f2");
std::cout << "in function2n";
ft.LeaveFunction("f2");
}

int main()
{
ft.EnterFunction("main");
f1();
std::cout << ft.CurrentFunction();
f2();
std::cout << ft.CurrentFunction();
}




Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.