存储函数指针的正确语法
Correct syntax to store function pointer
令人惊讶的是,无论使用函数名称之前的什么符号,以下代码都可以很好地在gcc和clang中编译:*
,&
或什么都没有。标准允许其中任何一个吗?存储函数指针的首选方法是什么?
#include <stdio.h>
typedef int foo(int a);
template <typename X>
int g(int y) {
return y * sizeof(X);
}
int main() {
foo* xxx;
// 1. what is correct according to standard?
// 2. why they all work?
xxx = *g<float>;
xxx = &g<float>;
xxx = g<float>;
printf("ok %dn", xxx(5));
}
所有这些都应该工作正常,并且在这里具有相同的效果。首选哪一个是样式问题,IMO 代码中的第一个令人困惑,另外两个是很常见的用法。
为方便起见,我将以与代码相反的顺序进行解释,
-
对于
xxx = g<float>;
,函数到指针的隐式转换是从g<float>
开始执行的,转换后的指针被分配给xxx
。 -
对于
xxx = &g<float>;
,operator&
显式用于获取函数的地址,则返回的指针分配给xxx
。 -
对于
xxx = *g<float>;
,函数到指针的隐式转换是从g<float>
执行的,然后指针被operator*
取消引用,返回一个函数引用,在其上执行函数到指针的隐式转换(再次(,转换后的指针最后分配给xxx
。
相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- 使用基类指针调用基类的值构造函数的语法是什么?
- C++使用 rand 定义函数语法
- C++中未命名函数指针的语法
- 将值传递给构造函数 c++ 的差异语法
- C++语法中的函数指针
- 存储函数指针的正确语法
- QObject::连接不起作用 - 使用函数语法找不到信号
- 对函数库中的语法感到困惑 std::bind
- 解释通过从函数引用返回数组的语法
- 函数错误 C2059:语法错误:'>'不起作用
- 当C++类函数参数之一是结构时,它们的语法有什么不同
- 将显式指定的函数模板重载作为模板参数传递的正确语法是什么?
- Qt的新信号/时隙语法问题 - 连接到一个简单的函数
- 需要"模板<>"语法 --> 通过函数调用类模板
- C++ std::函数语法问题
- 备用函数语法/函数原型
- 奇怪的c++语法:函数调用之前的类型定义
- c++数组语法(函数返回数组)
- 实现[B,C]=f(A)语法(函数f作用于具有两个或多个输出数组的数组)