-3

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

void dummy() 将始终评估为“真”

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);

为什么它总是试图传递 true 而不是地址?注意:如果重要的话,真正的代码是试图传递一个类的静态私有成员函数(单例)的地址。

编辑

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

4

1 回答 1

5

operator<<for ostream 没有采用函数指针的重载,因此bool选择了重载。函数指针被很好地传递,它只转换为 1 用于打印(这就是为什么警告与您打印它的行有关,而不是您传递它的行)。

AFAIK 除了打印其对象表示的字节外,没有可移植的方法来打印函数指针。

于 2013-06-06T15:03:47.280 回答