【问题标题】:Does void(*) in C++ mean anything?C++ 中的 void(*) 是否意味着什么?
【发布时间】:2017-05-10 14:40:48
【问题描述】:

我正在尝试理解 C++ 函数指针语法。当我在 Linux 上的 Eclipse 中输入时:

void(*);

它用一条消息说语法错误突出显示了该语句,但它让我编译它并且程序运行了。然后在 Visual Studio 上我尝试了它,它不会编译,说“期望一个表达式”。然而奇怪的是,当我这样做时:

std::vector<void(*)> myVector;

它在 Visual Studio 上编译得很好。同样在几个在线编译器上 void(*);靠自己的作品很好。我知道:

void (*)();

...是一个函数指针和..

void();

... 是一个函数签名,这就是你可以这样做的原因:

std::function<void()> func;

我在理解函数指针语法时遇到了很多麻烦。

谢谢。

【问题讨论】:

  • 什么编译器接受void (*);
  • 这个:ideone.com/lEeMY3,和cpp.sh,但这个没有codepad.org/Zl1UQRa3。 Visual Studio 将在 std::vector 声明/定义中接受它。奇怪的是,在带有 GCC 的 Eclipse 中,它会将其突出显示为错误,但仍然可以编译和运行。
  • 这听起来像是编译器错误或语言扩展,或两者兼而有之。我建议您尝试使用和不使用 -pedantic-errors 标志的 g++。使用 Ideone,语句 int(**); 可以编译,但例如int; 或特别是 int**;,无法编译。
  • @TitoneMaurice ideone 抑制了许多底层编译器的错误消息,它对任何事情都不是很好。 Eclipse 是一个 IDE,而不是编译器。您应该准确提及使用了哪个版本的 gcc 以及使用了哪些开关;我尝试的所有 gcc 版本都在默认模式下对 void (*); 给出了错误。
  • std::vector&lt;void(*)&gt; myVector; 是正确的,请注意我问的是void (*); 本身,这是一个错误。 (同样vector&lt;int&gt; myVector; 是正确的,int; 不是)。

标签: c++ function pointers void


【解决方案1】:

请记住,括号可用于更改某些事物的优先级。这就是为什么 void (*)() 的星号周围有括号,因为它与 void *() 非常不同。

void(*) 的情况下,括号就是这样的优先级更改括号。但它们不是必需的。 void(*) 的类型是 void*,简单明了。

你使用它的上下文很重要。

【讨论】:

  • 这很有趣,因为如果括号只是一个优先级的东西并且它意味着相同的东西,奇怪的是在我尝试的两个在线编译器上,如果我去掉括号它不会编译。
  • 这个假设(我写这篇文章时的答案)与使用 Ideone void(*); 编译但 void*; 不匹配的事实不符。就目前而言这很好,但它没有提供任何解释。
  • @Cheersandhth.-Alf 那部分只是一个编译器错误。
  • @T.C.我试过的另一个编译器也发生了同样的事情。空白( * );投诉,但无效*;很好。好吧,无论如何,我将这个归结为括号优先级。
  • @TitoneMaurice 什么编译器?
猜你喜欢
  • 2017-03-02
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 2013-01-05
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多