问题标签 [function-pointers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4624 浏览

c++ - 定义函数指针

我正在尝试调用内部 Windows NT API 函数 NtOpenProcess。我知道调用内部 API 可能是个坏主意,但是对于这个特定的工具,我需要这个 API 提供的低级访问。

我的问题是要使用这样的内部 API,我需要使用 Runtime Dynamic Linking,如本文所述

为此,我需要定义一个指向 NtOpenProcess 的函数指针。这是我的声明:

问题是,显然我上面的 typedef 有一个错误。编译器返回:

错误 C2059:语法错误:'__stdcall'

我使用了我的 IDE (Visual Studio 2008) 的方便的花花公子“转到定义”功能,发现声明中的 NTAPI 被定义为 __stdcall。

不幸的是,从我的声明中删除了 NTAPI,使其成为:

导致另一个错误:

错误 C2065:“_NtOpenProcess”:未声明的标识符

在这一点上,我说“当然它是未定义的,这就是为什么它是 typedef!”

有人在声明中看到我的错误吗?

0 投票
1 回答
7654 浏览

c++ - 运行时检查失败 #0 从 kernel32.dll 加载 QueryFullProcessImageName

我有一个需要在 WinXP 和 Vista64 上运行的应用程序。我的程序需要 QueryFullProcessImageName() 才能在 Vista 上工作,但不能在 XP 上工作。

我尝试通过 kernel32.dll 加载 QueryFullProcessImageName() (而不是静态链接),以便相同的可执行文件可以在 WinXP 和 Vista 上运行。加载它的代码是:

类型定义是

不幸的是,当函数指针被取消引用时,我在 Vista 上遇到了运行时错误:

运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针的结果。

typedef 直接来自 .h 文件,所以我不明白为什么它会搞砸。有什么帮助吗?我尝试了很多变种,但没有运气。

0 投票
1 回答
1995 浏览

c++ - 无法转换函数指针参数

我得到的错误:

相关定义:

在我看来 typedef 和实际的函数签名是相同的。

编辑:忘记了一个声明:

0 投票
3 回答
22593 浏览

c - C:函数指针和typedef问题

我有一个 C 函数,它以函数指针作为参数,它是一个析构函数,我将在程序结束时调用它。这是我的函数的原型:

我想将此函数指针存储到具有其他一些信息的结构中。为了有一个很好的结构,我想有一个指向这个函数指针的 typedef。这是我的 typedef :

这是我的结构:

在初始化步骤中,我想将“dest”字段设置为我的一个函数,这里是这个函数的原型:

当我尝试将结构的“dest”字段设置为“my_dummy_dest”时,会出现问题(实际上它只是一个警告,但我想抑制它):

我收到“警告:来自不兼容的指针类型的赋值”

当我比较它们时也一样:

我收到“警告:不同指针类型的比较缺少强制转换”

但是当我用另一个例程设置“dest”字段时,我没有收到任何警告。我不明白为什么我有这些警告。

0 投票
6 回答
760 浏览

c - 比较 C 中具有任意位数的两个值

我在 C 中创建了一个动态类型系统,以便创建一个可以包含不同位宽值的字典。动态对象的结构是:

我需要比较其中两个保存 A2D 读数的 Dynamics,然后将差异与 delta 值进行比较,以确定是否发生了变化。我能够想出的一种解决方案是将它们转换为 char 数组并逐字节比较它们,但这并不正确。我还有一个想法,即根据 Dynamics 占用的字节数(或者可能是类型)创建一个函数指针数组,并为每种支持的类型创建一个比较函数。任何人都可以提出不同的方法吗?感觉就像我错过了什么。

更新:

感谢您告诉我有关 memcmp 的信息,但我仍然有如何获得这两个值的增量的问题?据我所知,memcmp 只是返回一个指示哪个值更大的指标,而不是它们之间的差异。

更新到更新:

事实证明 memcmp 对我没用,因为我正在编译的架构是小端。

如果我要自己做一个 bignum 实现,那么 ephemient 感觉是正确的方法,但我决定我只是将值 memcpy 到我必须处理的最大可能类型(即 unsigned long long)中并使用它们进行数学运算。我想不出任何为什么这不起作用,但我认识到我可能是非常错误的,因为 C / 直接内存操作不是我的强项。

0 投票
9 回答
2792 浏览

c - C语言中关于函数指针的一个问题

有以下声明:

然后,在程序的某处有以下调用:

(忽略前三个参数和numeric)。

请问这是什么:

我知道这qsort是期望一个“指向函数的指针,它获取两个void指针并返回一个int”,因为它是第四个参数,但是上面写的内容如何满足呢?在我看来,这像是某种演员表,因为它由两个括号组成,但那将是一个非常奇怪的演员表。因为它接受一个函数并使该函数成为“指向函数的指针,该函数获取两个void指针并返回一个int”。这是没有意义的。
(我在这里遵循了一个规则,即type变量前括号中的类型将变量提升为该类型)。

所以我想我弄错了,也许有人可以告诉我如何阅读这个,顺序是什么?

0 投票
5 回答
1406 浏览

c - 强制转换函数在 C 中实际上是如何工作的?

在评估作业期间实际发生了什么?

foo转换类型和;之间有区别 强制转换类型是一个指针并且foo是一个函数。那么,编译器是否将 ' (foo)' 中的内容转换为指向的指针,foo然后才进行强制转换?因为似乎没有其他任何意义;另一种选择是将函数本身转换为指向获取 avoid*并返回inta 的函数的指针,据我所知,函数是内存中一段代码的标签,因此不能成为指针,即一个变量。

0 投票
2 回答
2330 浏览

c - 如何对一个函数指针进行类型定义,该函数指针将其自身类型的函数作为参数?

示例:一个函数接受一个函数(接受一个函数 (that ...) 和一个 int)和一个 int。

它在哪里递归爆炸(...)。是否有根本原因无法做到这一点,或者是否有其他语法?在我看来,没有演员表应该是可能的。我真的在尝试传递一个调度表,但我可以弄清楚我是否可以通过这种类型。

0 投票
2 回答
2321 浏览

c++ - C++ 函数指针问题

由于某种原因,试图将指向该函数的指针传递给可变参数函数会产生以下错误:

我不确定问题是什么,因为模板函数没有过载,并且模板参数是明确定义的,所以对于哪个函数传递指针是毫无疑问的......

有没有办法解决这个问题,不会为每个参数转换函数创建很多版本,但如果出现错误,仍然可以在异常中包含参数编号?(更好的方法是将参数编号作为参数传递,因此我的 dll 中没有该函数的多个副本。)

编辑:这似乎也导致编译错误。有没有办法创建指向模板函数的函数指针,还是我需要与普通函数不同?

该函数声明为:

EDIT2:添加运营商的地址又给出了另一个不同的错误......

0 投票
11 回答
902214 浏览

c - C 中的函数指针是如何工作的?

我最近对 ​​C 中的函数指针有了一些经验。

因此,继续回答您自己的问题的传统,我决定为那些需要快速深入了解该主题的人做一个非常基础的小总结。