【问题标题】:What is function name in c++ [duplicate]c ++中的函数名称是什么[重复]
【发布时间】:2022-01-05 03:35:34
【问题描述】:

我知道ASM中的函数名就是函数中第一条指令的地址。

所以我认为函数名应该是 c++ 中的正确值。但是为什么我也可以得到函数名的地址。两者都可以像这样分配给函数指针:

typedef int (*Func)();
int A(){
    return 1;
}
int main()
{
    Func* f = &A;
    f = A;
    (*f)();
}

所以想知道CPP中的函数名是什么,函数名和函数名的地址有什么区别;

更新: 因为我的错,我提交了错误的代码,我想问的代码是:

typedef int (*Func)();
int A(){
    return 1;
}
int main()
{
    Func f = &A;
    f = A;
    (*f)();
}

【问题讨论】:

  • 函数遵循与变量不同的规则。可以取一个函数的地址,和让它衰减一样:Func* f = A;.
  • 像数组一样,函数衰减为指针。你的两个任务是一样的。两个赋值都存储第一条指令的地址。
  • 只是细微差别之一
  • 唉,函数名不是函数名所指的机器码的字节,并且可能可以通过编程方式更改。函数名不是函数的 AST。在某些情况下,两者都很好。

标签: c++


【解决方案1】:

让我们逐行看一下您的代码 sn-p 的解释。

typedef int (*Func)(); //Statement 1: This means Func is just another name for a "pointer to a function that takes no parameter and returns an int

//Here you are defining a function named A that takes no parameter  and returns an int
int A(){
    return 1;
}
int main()
{
    Func* f = &A;//Statement 2
    f = A;//Statement 3
    (*f)();//statement 4
}

声明 1

这里有声明

typedef int (*Func)();

这意味着,那个

Func 只是 指向不带参数并返回int的函数的指针的另一个名称。从技术上讲,这不过是int(*)()

声明 2

这里有声明,

Func* f = &A;

左侧,我们定义了一个名为f 的对象,类型为Func*。也就是说,f 的类型是指向Func 的指针。但是由于Func 本身是一个指向不带参数并返回int 的函数的指针

这意味着f类型

指向指针的指针,指向不带参数并返回int 的函数。从技术上讲,它只不过是int(**)()

现在我们要看看语句 2 的右手边。但为此你必须知道这一点:

A 的类型是int(),称为函数类型

因此,当您编写表达式 &A 时,这意味着您将得到:

指向函数类型的指针。在这种情况下是int(*)()

为什么语句 2 有问题

所以基本上在左边你有一个int(**)() 类型的表达式,而在右边你有一个int(*)() 类型的表达式。所以类型中存在 mismatch,这正是错误所说的:

error: cannot convert ‘int (*)()’ to ‘int (**)()’ in initialization

声明 3

这里有声明,

f = A;

在左侧,您有一个 int(**)() 类型的表达式,如上文所述(在语句 2 的解释中)。特别是,f 的类型为 int(**)()

而在右手边,我们有int() 类型的表达式,如上所述(在语句2 的解释中)。特别是,由于A 是一个函数类型,并且具有int() 类型。

为什么语句 3 有问题

这里再次出现 mismatch 左侧和右侧的表达式类型,这正是错误所说的:

error: cannot convert ‘int()’ to ‘int (**)()’ in assignment

声明 4

这里有声明

(*f)();

你在这里做两件事:

  1. 取消引用指针f。但是由于f 的类型是int(**)(),取消引用f 的结果将是int(*)(),它只是一个指向不带参数并返回int 的函数的指针.

  2. 接下来,您将通过该结果指针调用该函数。在这种情况下,没有语法错误。也就是说,语句 4 中没有语法错误。

编辑

现在,既然您已将声明 2 编辑为 Func f = &A;,我将对此进行解释。

在这种情况下,在左侧f 的类型是Func。但是因为Func 只不过是int(*)()。这意味着:

f 本身是一个指向不带参数并返回int的函数的指针。即f 的类型为int(*)()

现在在右手边你有&A。但请注意,正如我已经解释过的,A 是一个 函数类型,在这种情况下为 int()。所以这意味着,当你写&A

&A 是一个指向不带参数并返回int 的函数的指针。这意味着,&A 的类型为 int(*)()。

所以基本上右侧和左侧的类型匹配,在这种情况下没有错误

【讨论】:

  • 对不起,我提交我的代码没有检查,语句2应该是Func f=&A,我想知道为什么我可以将int()转换为int(*)。只是设计问题还是其他与底层原理相关的问题?
  • @YDZhou 我已在答案末尾添加了对您编辑的问题的解释。看看这个。另请注意,int()不能隐式转换为int(*)。但是int() 可以隐式转换为int(*)()。这称为类型衰减
  • @YDZhou 你看过我编辑的答案吗(在我的答案末尾)。它回答了您编辑的问题。另外,请不要编辑您的问题,以免改变问题的意图。我花了 20 分钟写了这个答案,然后你突然改变了陈述 2。相反,你应该在问题的末尾添加一个编辑部分,说明你想了解 Func f = &A。这浪费了人们的时间和精力(这次是我的)。
  • 是的,我看看。很抱歉浪费你的时间,现在我已经按照你的建议做了。我会记得使用附加信息而不是直接编辑问题。 @Anoop
  • @YDZhou 不客气。 :)
【解决方案2】:

所以我想知道CPP中的函数名是什么

函数名是一个表达式。表达式的类型是函数类型。

&A 是表达式的地址。表达式的类型是指向函数类型的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 2023-04-06
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2020-12-12
    • 2019-10-10
    • 2017-05-29
    相关资源
    最近更新 更多