如何编写指向函数的函数指针,返回指向函数的函数指针?

2024-01-03

我想将函数的地址分配给函数指针,但是要寻址的函数返回一个与自身签名相同的函数指针,导致它以一种我根本无法编写返回类型的方式递归,对于函数指针甚至函数声明本身......

我想有一种简化问题的方法,这样就不会造成混乱:

我如何编写一个函数声明,使其可以返回指向自身的指针(或具有相同签名的任何其他函数)?

????? function(int a){
    // could be this function, or another with the same signature, 
    return arbitraryFunction;  
}

?????(*func)(int) = function;  // same problem as above

edit:

现在我有一个解决方案,尽管我不会将其作为答案发布,因为它非常丑陋。它通过简单地返回原始数据来摆脱递归void*指针作为返回类型,最终采用以下形式:

void* function(int parameter){
    return arbitraryFunction; // of the same signature
}

void*(*func)(int) = function; 
func = reinterpret_cast<void*(*)(int)>(func(42));  // sin

edit2:

看来函数指针和常规指针之间的转换是 UB,所以我不能使用void*在这种情况下...

要回答其中一条评论,这是为了在程序中的多个“主”循环之间传递控制,每个循环都有自己的函数。有很多方法可以做到这一点,但是在循环中返回函数指针(或 NULL 来终止程序)seemed就像最简单的方法一样,但我没有预料到指向数据的指针和指向函数地址的指针会彼此不兼容。我认为在这种情况下返回多态函数对象最终将是更明智的选择。


不要使用void*,因为不能保证void *可以保存函数指针。您可以使用void(*)()作为解决方法:

typedef void(*void_func)();
typedef void_func (*func_type) (int);
void_func arbitraryFunction(int a) {
    // could be this function, or another with the same signature, 
    cout << "arbitraryFunction\n";
    return nullptr;  
}
void_func function(int a) {
    // could be this function, or another with the same signature, 
    return (void_func) arbitraryFunction;  
}
int main() {
    // your code goes here
    func_type f = (func_type) function(0);
    f(0);
    return 0;
}

LIVE http://ideone.com/hEmPyq

C99 [6.2.5/27]:

指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。同样,指向 兼容类型的限定或非限定版本应具有 相同的表示和对齐要求。所有指针指向 结构类型应具有相同的表示和对齐方式 要求彼此一致。所有指向联合类型的指针都应具有 彼此具有相同的表示和对齐要求。指针 其他类型不需要具有相同的表示或对齐方式 要求。

C99[6.3.2.3/8]:

指向一种类型函数的指针可以转换为指向另一种类型函数的指针,然后再转换回来;结果应比较 等于原来的指针。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编写指向函数的函数指针,返回指向函数的函数指针? 的相关文章

  • 除了第一列之外,Gridview 行可点击?

    我使用以下代码使 gridview 的整行可单击 protected void gridMSDS RowDataBound object sender GridViewRowEventArgs e if e Row RowType Data
  • System.MissingMethodException:找不到方法?

    以前工作的 ASP NET WebForms 应用程序现在抛出此错误 System MissingMethodException 找不到方法 The DoThis方法位于同一个类上 它应该可以工作 我有一个这样的通用处理程序 public
  • Ruby 解释器嵌入到 C 代码中

    我只是尝试书中的一个简单例子 我有一个 sum rb 文件 class Summer def sum max raise Invalid maximum max if max lt 0 max max max 2 end end 还有一个
  • 根据另一个列表的内容对列表进行排序

    我有一个包含整数列表的列表和另一个包含同时包含整数和字符串的类的列表 我想做的是按字母顺序对列表进行排序 将第一个列表中存在的条目放在前面 这是我的代码和预期输出 using System using System Collections
  • ASP .NET MVC 5 - 客户地址一对一关系

    我在这里查看了论坛 实际上发现了一些类似的问题 但不是相同的问题 类似的解决方案没有给我正确的答案 我正在使用实体框架和代码优先方法来处理 ASP NET MVC 5 我想建立客户 gt 地址一对一关系的模型 我建模的是 客户等级 publ
  • 获取光标相对于控件的位置 - C#

    我想获取鼠标相对于鼠标指针所在控件的位置 这意味着当我将光标置于控件的起点 左上角 时 它应该给出 0 0 我正在使用以下代码 private void panel1 MouseMove object sender MouseEventAr
  • 堆栈独立的C/C++蓝牙API?

    我想知道是否有适用于 Windows XP Vista 7 x86 和 x64 的堆栈独立 C C 蓝牙 api 我的目标是创建连接并通过蓝牙发送 接收一些时间关键的数据 我的研究给了我以下选择以及这项任务的缺点 用于蓝牙的 Windows
  • 将 gcov 与 CMake/CDash 结合使用的详细指南?

    我在我的项目中使用 CMake 并设置了 cdash 服务器以进行连续 夜间构建 一切运行良好 通过设置 crontab 我们可以将每小时 每晚的构建 测试结果自动上传到我们的 cdash 服务器 我的下一步是将测试覆盖率报告添加到构建中
  • 扩展 MATLAB 函数名称的最大长度

    我编写了一个 MATLAB 程序 可以动态创建自定义 MATLAB 函数 并使用以下命令在其他 MATLAB 实例中启动它们unix命令 我使用这个程序来自动化 fMRI 神经影像分析 使用 SPM8 for MATLAB 一切正常 但是
  • DLL 需要访问其应用程序的符号

    在 C 中 DLL 是否可以访问加载它的应用程序的某些符号 我有一个加载插件 dll 的应用程序 这些插件需要访问该应用程序的某些API 是否可以在不创建共享此 API 的新 DLL 的情况下实现此目的 函数指针结构适合这种情况吗 示例 主
  • C# 列表框 ObservableCollection

    我正在尝试使用 ListBox DataSource ObservableCollection 但是我不知道如何在 OC 更新时让列表框自动更新 我可以在 OC 上挂接 CollectionChanged 事件 但是我需要对列表框执行什么操
  • 在 C# 中使用 as 关键字与泛型类型发生冲突的编译时行为

    当尝试对无法转换为的非泛型类型使用 C as 关键字时 编译器会给出无法转换类型的错误 但是 当对泛型类型使用 as 关键字时 编译器不会给出错误 public class Foo public class Bar
  • 从 Linq 的列表中选择多个字段

    在 ASP NET C 中 我有一个结构 public struct Data public int item1 public int item2 public int category id public string category
  • 将 libpng 链接到 android 原生项目

    我在尝试在本机 Android 项目中加载 libpng 时遇到问题 编译器似乎无法识别 libpng 函数 但可以识别类型 如 png byte 它可以正常编译类型 但如果我添加函数 则会抛出错误 这是编译输出 Windows 7 cmd
  • CS0246 找不到类型或命名空间名称“ErrorViewModel”(您是否缺少 using 指令或程序集引用?)

    我收到 CS0246 错误代码 我正在做一个 MVC net core 项目 我正在将 Razor 合并到我的 C 代码中 我在进行构建时收到此错误 我在最后一行收到错误 有人能帮我解决这个问题吗 global Microsoft AspN
  • Facebook Graph API“/userid/feed”返回空白

    我正在使用 Facebook C SDK 但似乎无法使用 Graph API 获取反馈数据 我已从用户那里获得了以下扩展权限 范围 离线访问 publish stream publish checkins create event read
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • C中的pipe()和fork()

    我需要创建两个子进程 一个子进程需要运行命令 ls al 并将其输出重定向到下一个子进程的输入 而下一个子进程又将对其输入数据运行命令 sort r n k 5 最后 父进程需要读取该数据 已排序的数据 并将其显示在终端中 终端中的最终结果
  • 构建 OpenCV 时出错 :: MonitorFromRect 未在此范围内声明

    我试图建立OpenCV version 2 4 8与它一起使用CodeBlocks and MinGw 我按照以下指示进行操作here http kevinhughes ca tutorials opencv install on wind
  • AddressAccessDeniedException :无需 netsh 即可解决它?

    我遇到了异常AddressAccessDeniedException因为我的processus没有注册URL的权限 我首先以管理员身份运行我的程序 好的 它成功了 但我现在想要分发我的应用程序 并且我希望每个用户都能够运行它 而不必成为管理

随机推荐

  • jooQ spring boot 多模式(读写分离)

    我想将 jooQ 与 Spring Boot 一起使用 我有主从架构 所以我想将 jooQ 与主从架构一起使用 主用于写入 从用于读取 我应该如何进行 现在我使用 pom xml 来配置 jooQ
  • 在后台启动 Flask 服务器

    我有一个烧瓶应用程序 目前正在按以下方式启动 phantom py author uruddarraju from phantom api v1 import app app run host 0 0 0 0 port 8080 debug
  • 设置全局 CURL 超时

    我正在使用专有的第 3 方 Drupal 模块 该模块通过curl 查询第 3 方服务 该服务最近有点不稳定 这使我的页面加载速度大大减慢 当我有大量流量时 我会达到 max connections 该扩展查询的信息并不重要 但它足够重要
  • 如何在 Element UI 表行中正确设置链接(应该很简单?)

    我在 Element UI 中得到了一张包含用户项目的表 由于 Element UI 不适用于 tr tr 我对如何处理这件事有点困惑 该表的目的是显示用户的项目并对其执行基本的 CRUD 操作 这意味着对于每一行 都应该显示一个唯一的 I
  • 将 YYYYMMDD 更改为 MM/DD/YYYY

    所以我的日期是 20170529 但每当我尝试将其格式化为日期时 单元格就会变成 所以通常情况下 这意味着列宽太小 但即使当我扩展列时 它也只是显示 我如何将这些转换为日期 DATEVALUE TEXT A1 0000 00 00 并将结果
  • 我们可以将变量从一个 C 程序传递到另一个 C 程序吗?

    所以我想将一个变量从一个c 程序传递到另一个c 程序 例如 main char str Hello there system program2 exe 我想用str in program2 exe 有没有办法将变量传递给另一个程序 我使用文
  • 当单元格中的文本发生变化时,如何执行函数? (谷歌文档)

    我一直在寻找一个函数 当某个单元格中的某些文本等于某些内容时 可以更改一行中所有单元格的颜色 我在这里找到了它 Google 电子表格 当单元格更改文本时更改行颜色的脚本 https stackoverflow com questions
  • 缩短字符串时 std::string::resize 和 std::string::erase 之间的区别

    当缩短一个std string基本上有两种可能性 string resize length or string erase length 鉴于我们知道字符串会变小 那么两者之间有什么区别 resize必须检查是否length gt curr
  • Xcode 7 从 XCUIElement 转换为不相关类型“String”在获取 JSON 时始终失败

    我试图从 JSON 数组中获取值 但收到错误 从 XCUIElement 进行转换 不相关的字符串总是失败 我正在使用 Xcode 7 和 iOS 9 1 我的代码如下 let url NSURL string urlAsString le
  • 如何在 Ember.js 中动态加载部分/视图/模板

    所以我有以下设置 在主页上 基于来自使用夹具数据的模型的列表显示生成器列表 现在 当单击其中一个生成器链接时 会显示一个新页面 其中包含一些根据该夹具数据动态生成的输入字段 到目前为止 一切都很完美 现在 当我更改生成器页面中的输入字段的值
  • 使用sql server Convert函数将hijri转换为公历日期

    我的桌子上有一个简单的桌子sql server在我的表中有一个日期字段 并在日期字段中保存一个hijri date 我想用sql server转换函数进行转换hijri date to gregorian date 我怎样才能做到这一点 我
  • 在 VS2015 的开发人员命令提示符中找不到 dnx 命令

    刚刚安装了 Visual Studio 2015 RC 当我打开Developer command prompt for VS2015并输入dnx它说 dnx 不被识别为内部或外部命令 可操作 程序或批处理文件 请注意 两天后我发现如果我输
  • 轻量且快速的 android json 解析器? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我开始项目时 我选择了 GSON 因为它已经完成得最多 并且得到了良好的支持 我现在感觉表现不是很好
  • 使用 sp_xml_preparedocument 和直接从 xml 参数选择有什么区别

    我在 MSSQL 2012 中有一个存储过程 sp 获取 xml 数据类型并将数据插入表中 我发现我可以使用两个选项 option 1 DECLARE strXML AS xml SET strXML
  • svn diff 输出文件中的所有行

    我已经搜索了一段时间 但仍然找不到解决这个问题的简单方法 我想在文件的两个修订版之间生成差异but我希望输出显示all我的文件的行 顺便说一句 我在 AIX 5 3 上使用 svn 1 6 17 示例 比较我的文件 test file 的修
  • 在 C# .net 中的 Web 表单上通过数组填充组合

    我有四个长日期时间类型的变量 我想在网页上的这四个值的帮助下填充组合 使用c Sharp 组合应该显示相应日期时间变量的月份名称 我怎样才能做到这一点 您还可以使用数据表来实现此目的 简单地说 ddlName DataSource data
  • 索引(从零开始)必须大于或等于零且小于参数列表的大小

    我正在尝试在数据库中创建一个新表 该表的名称为结账 支票号码放入 0 中 但是当我运行该程序时 它出现了 Productlist varchar 50 标题中显示的错误 SQLiteCommand tableCreateCommand my
  • 影响 ListView 标题的 Windows 主题

    我使用一个包含 ListView 的简单表单创建了新的 Windows 窗体应用程序 C 然后我改变了查看房产 http msdn microsoft com en us library system windows forms listv
  • 如何在 vNext 依赖注入中创建构造函数订阅

    我正在尝试使用一次性 vNext 应用程序 我想做的是创建一个名为 DataService 的虚拟类 它将返回一些数据 然后创建使用 DI 将 IDataService 参数作为构造函数的对象 所以我的 IDataService DataS
  • 如何编写指向函数的函数指针,返回指向函数的函数指针?

    我想将函数的地址分配给函数指针 但是要寻址的函数返回一个与自身签名相同的函数指针 导致它以一种我根本无法编写返回类型的方式递归 对于函数指针甚至函数声明本身 我想有一种简化问题的方法 这样就不会造成混乱 我如何编写一个函数声明 使其可以返回