c ++:地址将始终评估为真错误

ste*_*225 -2 c++ function-pointers

我编写了自己的atexit方法,问题是,传入的所有内容都是1.当我尝试在将地址提供给我的atexit之前打印地址时,编译器生成了以下警告:

void dummy()将始终评估为'true'

void atexit(void(*func)(void))
{
   cerr << func << endl; // prints 1
   // store func for later
}

void dummy()
{
   cout << "dummy()\n";
}

cerr << &dummy << endl; // prints 1, generates warning
atexit(&dummy);
Run Code Online (Sandbox Code Playgroud)

为什么总是试图传递真实而不是地址?注意:如果重要,真正的代码是试图传递类的静态私有成员函数(singleton)的地址.

编辑

我不在乎打印地址是什么,这是一个例子.我想弄清楚的是为什么地址作为布尔值传递给atexit,因此始终为1.

Ste*_*sop 5

operator<<for ostream没有带有函数指针的bool重载,因此选择了重载.函数指针传递正常,它只转换为1进行打印(这就是警告与打印它的行相关的原因,而不是传递它的行).

AFAIK没有可移植的方式来打印函数指针,而不是打印其对象表示的字节.

  • @ steveo225:那么在问题得到解答之前,你将不得不做一些工作.除非有人能够在没有看到真实代码的情况下猜出你犯了什么错误,这种情况经常发生.如果你能够制作一个SSCCE(http://sscce.org/)那么人们可以看看你做错了什么而不是猜测.如果你的成千上万行代码中存在某个错误,那么就我们所知道的那样,由于内存损坏,这个问题几乎可以解决. (3认同)
  • @ steveo225:这些地址中有多少是函数指针?打印一个普通的指针工作正常,它只是功能指针等没有. (3认同)