【问题标题】:function pointer without typedef没有 typedef 的函数指针
【发布时间】:2010-09-22 14:50:43
【问题描述】:

是否可以在不使用 typedef 的情况下将预先声明的函数的类型用作函数指针?

函数声明:

int myfunc(float);

通过某种语法将函数声明用作函数指针

myfunc* ptrWithSameTypeAsMyFunc = 0;

【问题讨论】:

  • 你想要一个只能指向你自己的 delcared 函数的函数指针?
  • @wheaties 我想要一个函数指针,指向与 myfunc 具有相同签名的函数
  • 您知道您可以将typedef 应用于函数声明以typedef 其类型吗? typedef int myfunc(float); myfunc *ptrWithSameTypeAsMyFunc = 0;?大多数人没有意识到这一点,并认为他们需要丑陋的(*foo) 语法。

标签: c++ c function-pointers typedef syntactic-sugar


【解决方案1】:

不符合 2003 年标准。是的,随着即将到来的 C++0x 标准和 MSVC 2010 和 g++ 4.5:

decltype(myfunc)* ptrWithSameTypeAsMyFunc = 0;

【讨论】:

  • 问题是我的代码在启用 c++0x 的情况下无法编译。所以这对我来说没有可用的解决方案:S
  • 使用 g++,您可以使用 typeof(myfunc) 而不是 decltype(myfunc),它甚至可以在非 C++0x 模式下使用。
  • 对我来说这个解决方案不可用,但我会接受这个作为答案。也许我会更改我的代码,直到它用 c++0x 编译。
【解决方案2】:

是的,可以在没有 typedef 的情况下声明函数指针,但不可以使用函数名来做到这一点。

通常使用 typedef,因为声明函数指针的语法有点巴洛克式。但是,不需要 typedef。你可以写:

int (*ptr)(float); 

ptr 声明为一个函数指针,指向一个采用float 并返回int 的函数——不涉及typedef。但同样,没有语法允许您使用名称 myfunc 来执行此操作。

【讨论】:

    【解决方案3】:

    是否可以在不使用 typedef 的情况下将预先声明的函数的类型用作函数指针?

    我要作弊

    template<typename T>
    void f(T *f) {
      T* ptrWithSameTypeAsMyFunc = 0;
    }
    
    f(&myfunc);
    

    当然,这也不是完全没有缺陷:它使用了函数,所以必须定义它,而decltype之类的东西没有使用函数,不需要定义函数。

    【讨论】:

      【解决方案4】:

      不,目前没有。 C++0x 将改变auto 的含义,并添加一个新的关键字decltype 可以让你做这样的事情。如果您使用 gcc/g++,您还可以考虑使用其 typeof 运算符,这非常相似(在处理引用时有细微差别)。

      【讨论】:

        【解决方案5】:

        不,没有 C++0x decltype:

        int myfunc(float)
        {
          return 0;
        }
        
        int main ()
        {
          decltype (myfunc) * ptr = myfunc;
        }
        

        【讨论】:

          【解决方案6】:

          gcc 有 typeof 作为 C 的扩展(不了解 C++)(http://gcc.gnu.org/onlinedocs/gcc/Typeof.html)。

          int myfunc(float);
          
          int main(void) {
              typeof(myfunc) *ptrWithSameTypeAsMyFunc;
              ptrWithSameTypeAsMyFunc = NULL;
              return 0;
          }
          

          【讨论】:

          • GCC 不需要 C++ 中的 typeof 扩展,因为它实现了(即将成为标准的)decltype,其用途几乎相同。
          【解决方案7】:
          int (*ptrWithSameTypeAsMyFunc)(float) = 0;  
          

          有关基础知识的更多信息,请参阅here

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多