加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSS
您当前的位置: > 论文 > 综合论文

func__函数的使用

时间:2026-04-01 16:29:47  来源:网络整理  作者:佚名

namespace _private{

class TestBase{

public:

virtual ~TestBase(){}

};

class Test: public TestBase{

public:

Test(){INFO();}

template

Test(T){INFO();}

Test(int, ...){INFO();}

~Test(){INFO();}

static void bar(){INFO();}

template

operator T()const{

INFO();

return T();

friend __stdcall void foo(TestBase& t){INFO();};

struct Widget{};

};

int main(){

using namespace _private;

using namespace std;

Test t1;

Test t2(0,'a'物业经理人, 'b');

Test const t3=Test(0.);

Test::bar();

foo(t1);

int i=t3;

Test::Widget wg=t3;

system("pause");

return 0;

在默认为__PRETTY_FUNCTION__的输出是:

_private::Test::Test()

_private::Test::Test(int, ...)

_private::Test::Test(T)

with T = double

static void _private::Test::bar()

void _private::foo(_private::TestBase&)

_private::Test::operator T() const

with T = int

_private::Test::operator T() const

with T = _private::Test::Widget

virtual _private::Test::~Test()

virtual _private::Test::~Test()

virtual _private::Test::~Test()

Press any key to continue . . .

在GCC里的基本格式是:

(static or virtual)namespace::class::function(const or volatile), 而且对template还有附加描述, 但可惜没有对调用规范的描述.

第二个问题是"它是否能用于构造函数的初始化列表?"

为什么会这样问呢? 因为据标准说它只是函数体内隐式的定义. 即:

struct A{

A():pstr(str){  // err

static const char str

="hello";

const char* pstr;

};

但这样是错的,在初始化列表里的str会被认为是还没声明的. 但我用__func__

却没有报错.

struct A{

A():pstr(__func__){  // ok

static const char str

="hello";

const char* pstr;

};

钓鱼网, 看来它是先于函数体的.(我只用GCC试我还没肯定这个行为是否正确), 因为这个不确定所以我想了第三个问题"它是否能用于默认参数?".

简单的代码试验说明这是不能的:

void foo(char const* pstr=__func__); // err

再试试

void foo(char const* pstr=__FUNCTION__); // ok

竟然编绎通过了, 但pstr=="". (看来这是__func__和__FUNCTION__的区别了)

看来它不是能作默认参数的了.

嗯, 真的吗?是否会有特例呢? 于是有想了Local Class的情况:

void foo(){

__func__;  // 必须在bar的定义前先显式用一次__func__

struct A{

void bar(char const* pstr=__func__){ // ok

puts(pstr);

};

A a;

a.bar();   // 输出的是"foo"而不是"bar"

对于第四个问题我没想到太好的例子,大概只想到两个:

(base64的编码表)

char

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789(int i){

if(i==62)return '+';

if(i==63)return '/';

return __func__

char

(*EnBase64Tab)(int)=&ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789;

(COMMAND解释事例)

class Command{

virtual void do_execute()=0;

public:

static void Execute(const char* script

){

/*

foreach(vec)

if(script

==vec.iter)

*iter.do_execute();

*/

protected:

static  CMDVEC vec;

};

CMDVEC Command::vec;

class Edit: public Command{

virtual void do_execute(){}

static Edit edit;

Edit(){Command::vec.push_back(std::make_pair(__func__起步网校贝语网校, this));}

};

Edit Edit::edit;

class Search: public Command{

virtual void do_execute(){}

static Search search;

Search(){Command::vec.push_back(std::make_pair(__func__, this));}

};

Search Search::search;

就是说若你的应用中函数和它的名子有很大关联的时候可以用上它.

第五个问题是用那个比较好?

我查了一下网上的资料俱称__FUNCTION__只是__func__的一个宏. 但我实际在GCC的预处理器上试过并不是这样. 嗯我油印得一般情况下应该用__func__, 因为它比较短. 而且它是标准里指定的.

对于这个新特性我个人理解基本上是这样了, 还需要注意的是在不支持新特性的编绎器上不要用__func__作为变量名,即使你认为不会用任何新行性一流范文网, 也应该注意这点.

来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
相关文章
栏目更新
栏目热门