【发布时间】: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<void(*)> myVector;是正确的,请注意我问的是void (*);本身,这是一个错误。 (同样vector<int> myVector;是正确的,int;不是)。
标签: c++ function pointers void