【问题标题】:Observations and confusions while calling C/++ functions [closed]调用 C/++ 函数时的观察和困惑 [关闭]
【发布时间】:2011-11-03 00:37:49
【问题描述】:

为什么可以这样调用C/C++函数:

(&myAwesomefunction)(arg1,arg2,arg3...);

当然,获取函数的地址会给你一个指针/地址。据我了解,指针不能作为函数调用。到底发生了什么?

是不是说我可以像函数一样调用任意地址?

// Is this legal?
int x = 69;
(&x)(3,78,69.456,'c','o','n','d','o','m');

这意味着什么?

【问题讨论】:

  • 我不会将一种语言称为“残破”的语言,并希望从足够了解该语言能够回答的人那里得到答案。阅读常见问题解答。
  • 您可以将任何指针调用为具有强制转换的函数,但如果它不是有效的函数指针,则它是未定义的行为。
  • 如果函数不是内存中的地址,你的印象是什么?
  • C 类型系统正是完美的因为它让你告诉编译器“我知道我在做什么,不要限制我。”如果你真的不知道自己在做什么,那你就完蛋了,但那是你的错。
  • 类型为一种语言提供了大量有用的特性,当你进行原始转换或其他任何事情时,你不会完全放弃类型系统(由于你列出的原因,这通常是不受欢迎的),但您在该特定实例中覆盖它。此外,您可以在需要时完全覆盖类型系统的原因是因为它的类型完全是编译时概念。运行时没有类型信息与数据一起存储(这也是 C 语言如此之快的部分原因)。简而言之,如果您不喜欢或无法处理编写可移植程序集的复杂性,那么 C 不适合您。

标签: c++ c function pointers syntax


【解决方案1】:

相反,指向函数的指针是唯一可作为函数调用的东西。函数调用运算符的定义开始:

表示被调用函数的表达式应具有类型 指向返回 void 或返回其他对象类型的函数的指针 比数组类型。

(这意味着您的第二个假设是合法的,因为&x 不具有指向任何类型函数的指针的类型。

那么,你可能会问,为什么还可以调用这样的函数(其中myAwesomefunction 是声明为函数的标识符)?

myAwesomefunction(arg1,arg2,arg3...);

答案是像myAwesomefunction 这样的标识符是一个主要表达式,它的计算结果是一个函数指示符。函数指示符的定义说:

函数指示符是具有函数类型的表达式。除了 当它是 sizeof 运算符或一元 & 的操作数时 运算符,类型为“函数返回类型”的函数指示符 转换为具有“函数指针”类型的表达式 返回类型''。

因此,正式地,当您编写myAwesomefunction(arg1,arg2,arg3...); 时,myAwesomefunction 计算为函数指示符,然后将其转换为指向函数的指针,然后用于调用函数。

将函数指示符转换为指向函数的指针类似于将具有数组类型的表达式转换为指向数组第一个元素的指针。

【讨论】:

    【解决方案2】:

    是的,第一个是合法的,因为 &myAwesomefunction 将是一个指向具有已知签名的函数的指针。 C++ 允许您使用与调用函数相同的语法来调用函数指针。

    第二个例子不合法,因为 C++ 知道 &x 是指向整数的指针,而不是函数。

    第一个例子怎么可能?那么编译器知道每个表达式的类型。我知道“myAwesomefunction”是一个函数名。它知道“&myAwesomefunction”将是一个指向 myAwesomefunction 的指针,并且与 myAwesomefunction 具有相同的签名。然后它会检查 () 并知道如果你有一个函数指针,唯一的逻辑含义是函数调用。它可以确保括号内的内容与函数的签名匹配。

    没有歧义,编译器也没有理由强迫您在调用函数指针之前取消引用它。如果您在函数指针后使用括号,编译器可以计算出它的函数调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-08
      • 2021-03-30
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 2012-08-26
      相关资源
      最近更新 更多