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

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(使用前将#替换为@)

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

  • Qt 和 Sqlite 示例

    我正在寻找一些使用 Qt 的示例代码 它是带有 Sqlite 驱动程序的 SQL 模块 我需要示例的主要原因是我之前有 Qt 数据库接口的经验 并且 Sqlite 在字段类型方面有一些奇怪的行为 类型是按字段存储的 而不是按列存储的 The
  • 集群():是否可以仅检查文件是否已锁定,而不实际获取锁定(如果没有)?

    我的用例如下 我有一个程序 它强制在任何给定时间只能运行它的一个实例 因此在启动时它总是尝试在标准位置获取锁定文件 并在该文件终止时终止已经被锁定 这一切都工作正常 但现在我想用一个新的命令行选项来增强程序 当指定该选项时 将导致程序只打印
  • 没有配置身份验证处理程序来处理该方案

    这是一个非常烦人的问题 我在我的 asp net core 项目上设置 cookie 身份验证 有时会出现此错误 有时不会 没有图案 它只是开始抛出错误 然后突然停止 然后再次开始 例外情况是 InvalidOperationExcepti
  • 二叉树和快速排序?

    我有一个家庭作业 内容如下 别生气 担心 我是not请你帮我做作业 编写一个程序 通过使用二分查找的快速排序方法对一组数字进行排序 树 推荐的实现是使用递归算法 这是什么意思 到目前为止 这是我的解释 正如我在下面解释的那样 我认为两者都有
  • 如何在建立上下文时设置连接超时-PrincipalContext

    using PrincipalContext ctx new PrincipalContext ContextType Domain Domain UserName Password UserPrincipal U new UserPrin
  • 有关shared_ptr的竞态条件示例

    为什么没有竞争条件代码片段 https godbolt org z nEYPYqdqK below include
  • 使用c#在mac上启动外部进程

    我成功地使用 System Diagnostics Process Start 在 Windows 上启动我的外部单声道可执行文件 然而在mac上却失败了 我没有收到任何错误 只是什么也没发生 我尝试按以下方式进行操作 System Dia
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • 对列表中的一系列整数求和

    假设我有一个这样的列表 List
  • 如何通过分解 y 轴来减小 mschart 的高度

    如何降低 mschart 的高度 如下所示 编辑 就我而言 我不想查看中断图表 this chart1 ChartAreas 0 AxisY ScaleBreakStyle Enabled false 您似乎正在寻找AxisY ScaleB
  • 为什么 C# 中的命名空间允许循环依赖?

    在 c 中 您可以在文件 a cs 其命名空间为 MyApp A 中拥有一条语句 using MyApp B 而文件 b cs 其名称空间为 MyApp B 已经包含该语句 using MyApp A 如果类似的依赖关系存在于不同的 dll
  • 如何检查日期时间是否发生在今天?

    有没有比下面的代码更好的 net 方法来检查 今天 是否发生了 DateTime if newsStory WhenAdded Day DateTime Now Day newsStory WhenAdded Month DateTime
  • 对 Action 方法的两个并行 ajax 请求排队,为什么?

    我正在使用 ASP NET MVC 开发一个视频网站 我希望在我的应用程序中拥有的一项功能是转码视频 但由于转码过程可能非常耗时 我想向客户端用户展示该过程的进度 因此 我的架构是使用一个控制器操作来处理整个转码过程 并将其进度写入存储在服
  • C 中的等效 plpgsql 触发器

    我有一个 PostgreSQL 9 0 服务器 并且在某些表上使用继承 因此我必须通过如下触发器模拟外键 CREATE OR REPLACE FUNCTION othertable before update trigger RETURNS
  • 将“C# 友好类型”名称转换为实际类型:“int” => typeof(int)

    我想得到一个System Type给定一个string指定 原始 类型C 友好名称 基本上与 C 编译器读取 C 源代码时的方式相同 我觉得描述我所追求的最好方式是单元测试的形式 我希望存在一种通用技术 可以使以下所有断言通过 而不是尝试对
  • 为什么在一行中使用这个 C++ 函数两次会导致编译错误?

    我在尝试在 Visual C 2010 中实现智能相等测试宏类型模板函数时遇到了一些麻烦 该函数与VS 中关于模板函数默认参数的错误 https stackoverflow com questions 10343177 why do i g
  • C# 使用 .Equals() 比较两个 double

    我使用 ReShaper 当我用 比较两个双精度值时 它建议我应该使用 Math 具有公差的 ABS 方法 看 https www jetbrains com help resharper 2016 2 CompareOfFloatsByE
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web
  • 在派生类中访问基类变量

    class Program static void Main string args baseClass obj new baseClass obj intF 5 obj intS 4 child obj1 new child Consol
  • 获取线段上最接近另一个点的点[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想找到线段AB上最接近另一个点P的点 我的想法是 Get a1 and b1由直线公式y1 a1x b1 使用 A 点

随机推荐

  • 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
  • 如何编写指向函数的函数指针,返回指向函数的函数指针?

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