【问题标题】:Getting C++ Function Address using VSCode & VS使用 VSCode 和 VS 获取 C++ 函数地址
【发布时间】:2021-08-14 00:40:02
【问题描述】:

我已经在我的 VSCode 中尝试过这段代码,理论上输出应该给我函数的地址

#include<iostream>
using namespace std;
int getNumber(){
    return 9000;
}

int main(){
    cout<<getNumber<<endl;
    return 0;
}

在 VSCode 中运行代码后,输出为:1

所以我让朋友在 Visual Studio 上运行完全相同的代码(因为我没有 VS),输出是内存地址。

我的问题是,

  1. 为什么该代码在 VSCode 和 VS 中运行时的输出不同?
  2. 我应该怎么做才能使用完全相同的代码在 VSCode 中获取函数的地址?

【问题讨论】:

  • VSCode 是一个 IDE。您如何编译/运行该代码?
  • @user4581301 OP 似乎已经知道了。
  • 是的。重新阅读问题。
  • 如果我的问题弄错了,我很抱歉。我使用 minGW 作为编译器,并在终端中运行代码
  • 这里没有错。您遇到了一个古怪的案例,您没有获得大多数人期望的转换。这很难搜索,除非您已经知道发生了什么,如果您知道发生了什么,为什么还要问这个问题?

标签: c++ visual-studio-code function-pointers


【解决方案1】:

std::ostream::operator&lt;&lt; 具有bool 的重载,并且指针可以隐式转换为bool,因此 VSCode 的输出(您告诉我们您正在使用 mingw 进行编译)是正确的。因为函数getNumber的地址一定是非零的,所以它变成了true,当转换为bool时等于1,所以这就是打印出来的。

另一方面,MSVC(Visual Studio 用来编译您的代码)似乎弄错了。

为了确保你输出函数的地址,你可以这样做:

cout << (void *) getNumber << endl;

同样,void * 的特定重载可确保 getNumber 随后被解释为地址。


附录:如果设置了足够高的警告级别,gcc 会对此发出警告,请参阅:https://wandbox.org/permlink/J9kxSzLshRQsdt0e

【讨论】:

  • 一个快速的技巧,看看你是否真的得到了bool,当你不想的时候,把&lt;&lt; boolalpha打到那个打印行,看看你是否得到了真实的。跨度>
  • @user4581301 好主意。
  • 这是一些晦涩的警告! warning: the address of 'int getNumber()' will never be NULL [-Waddress]
  • @VladFeinstein 是的,我同意,但至少它升起了一面旗帜。 clang 稍微好一点:wandbox.org/permlink/PdLdfUGaeEsPsG30
  • 谢谢你的回答和这次讨论消除了我的困惑:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 2011-06-27
  • 2020-12-03
  • 2011-02-25
  • 1970-01-01
相关资源
最近更新 更多