c ++函数指针没有改变

时间:2015-12-13 19:51:56

标签: c++ function pointers

我已定义了一些功能,我打印了这样的地址:

#include<iostream>
#include <string>

using std::cout;

std::string func()
{
    return "hello world\n";

}

int func2(int n)
{
    if (n==0)
    {
        cout << func2 << std::endl;
        return 1;
    }

    cout << func2 << std::endl;

    return n + func2(n - 1);
}

//================================================
int main()
{
    int (*fun)(int) = func2;

    cout << fun;

    cout << std::endl << func2(3);
}

当我打印函数的名称(地址)时,它们都会在我的编译器上打印1(Mingw gcc 4.8)。

可以,还是应该有所不同?

2 个答案:

答案 0 :(得分:3)

对于operator<<std::ostream不存在带有函数指针的重载。因此优选operator<<(std::ostream&, bool)过载。转换为true时,函数的地址始终会计算为bool。因此,打印1。

或者,如果函数指针不大于数据指针的大小,您可以通过void*将函数指针强制转换为reinterpret_cast并引发operator<<(std::ostream&, void*)重载,从而获取打印功能的实际地址。

int (*fun)(int) = func2;
std::cout << reinterpret_cast<void*>(fun) << std::endl;

Live Demo

然而,正如Neil和M.M在评论中提到的那样,没有从函数指针到数据指针的标准转换,这可能引起未定义的行为。

或者,根据我的拙见,您可以将函数指针格式化为char数组缓冲区,并按以下方式将其地址转换为字符串:

unsigned char *p = reinterpret_cast<unsigned char*>(&func2);
std::stringstream ss;
ss << std::hex << std::setfill('0');
for(int i(sizeof(func2) - 1); i >= 0; --i) ss << std::setw(2) 
                                              << static_cast<unsigned int>(p[i]);
std::cout << ss.str() << std::endl;

Live Demo

答案 1 :(得分:0)

您不打印地址,因为它现在已转换为布尔值。

但你可以做到,例如这样:

std::cout << reinterpret_cast<unsigned long long int *>(func2) << std::endl;

现在你将获得实际地址。