【问题标题】:Why parentheses are important in function pointer declaration?为什么括号在函数指针声明中很重要?
【发布时间】:2011-05-24 10:47:40
【问题描述】:

我不明白为什么下面的声明被接受:

typedef void    (*_tStandardDeclaration)(LPVOID);

而以下不是:

typedef void    *_tDeclarationWithoutParenthesis(LPVOID);
typedef void*   _tAlternateDeclaration(LPVOID);

我正在使用 MSVC6(我知道它已经过时且不标准,但需要它来维持每年一千万的收入系统:/)

【问题讨论】:

  • 请注意,所有这些 typedef 声明都是有效的。没有一个是无效的 C++。

标签: c++ function-pointers typedef function-declaration


【解决方案1】:

指针符号默认绑定到类型,所以函数指针需要用括号表示指针实际上是在名字上,而不是在返回类型上。

【讨论】:

    【解决方案2】:

    没有括号,您声明的函数返回 void*,而不是指向返回 void 的函数的指针。

    【讨论】:

      【解决方案3】:

      以下代码在 MacOS X 10.6.5 上被 GCC 4.2.1 接受,编译器设置为 fussy:

      c++ -Wall -Wextra -c xx.cpp
      

      代码:

      typedef void *LPVOID;
      
      typedef void    (*_tStandardDeclaration)(LPVOID);
      
      typedef void    *_tDeclarationWithoutParenthesis(LPVOID);
      typedef void*   _tAlternateDeclaration(LPVOID);
      

      第一个给出一个指向返回void的函数的指针;后两者是等价的(间距没有区别),并为您提供一个类型为“返回指向 void 的指针的函数(采用 LPVOID 参数)”。

      您可以使用它们来声明函数指针:

      typedef _tDeclarationWithoutParenthesis *_tFunctionPointer;
      

      很有趣,不是吗...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-11
        • 2013-04-13
        • 2012-04-05
        • 1970-01-01
        • 2020-04-13
        • 1970-01-01
        • 2021-05-10
        • 1970-01-01
        相关资源
        最近更新 更多