Tag: 函数指针

C:函数指针转换甚至是什么?

假设有人想创建一个可以容纳多个函数指针和不同类型的数组 。他将如何这样做呢? 也许一个void指针数组可以工作?…事实certificate,不是因为为了使用存储在void指针中的函数,你必须将它们(void指针)转换/转换回函数指针和… “函数指针和void指针之间的转换是不可能的.void *从不是函数指针的通用指针类型,仅用于对象指针。它们不是兼容的类型。 […]你可以在void *和一个函数指针之间进行转换,但是会发生什么是未定义的行为。 您将依赖系统特定的非标准扩展。“ – @ Lundin( 这里 ) 代替… 稍微好一点的是使用函数指针类型,如void(*)(void)作为通用指针。 您可以转换为/从不同的函数指针转换 ,将发生的是特定于编译器(实现定义的行为)。 也就是说,代码仍然是不可移植的,但至少你不会冒程序崩溃来调用未定义的行为。 – @ Lundin( 这里 ) 也就是说, 从一个函数指针转换到另一个函数指针甚至意味着什么呢? 有人可以解释一下吗。 也许是一个例子。

从静态初始化的另一个文件中使用该函数的可能方法是什么?

我的问题很简单。 我的程序中有三个文件。其中一个文件有静态函数。我可以从另一个文件中使用该函数吗? 我知道文件本身访问的静态函数。我想知道任何可能的方式。 如果方式可用,我如何在function声明方面停止访问?

C中Doxygen中的函数指针处理

在我的代码中,vtable包含几个函数指针。 Doxygen无法跟随它们。 我想强制它识别可能的路径,以生成一个完整的调用图,因为现在缺少这部分。 例: typedef Bool(*SPECIAL_FUNC)(KEY key); typedef struct{ int a; int b; SPECIAL_FUNC; }OBJ; Bool add(KEY key); //code… Bool sub(KEY key); //code…

指向数组的指针和指针指针有什么区别?

我是编程和学习数组指针的新手。 我现在有点困惑。 看看下面的程序: #include int fun(); int main() { int num[3][3]={23,32,478,55,0,56,25,13, 80}; printf(“%d\n”,*(*(num+0)+1)); fun(num); printf(“%d\n”, *(*(num+0)+1)); *(*(num+0)+0)=23; printf(“%d\n”,*(*(num+0))); return 0; } int fun(*p) // Compilation error { *(p+0)=0; return 0; } 这是我老师的笔记中写的程序。 在main()函数中,在printf()函数中,dereference运算符被使用了两次,因为num是指向数组的指针,因此第一次取消引用运算符将​​指向int ,然后第二个将给出指针所在的值指向。 我的问题是,当我将数组名称作为参数传递给函数fun()为什么使用*p ; 为什么不**p作为num是指向数组的指针? 第二件事为什么*(p+0)用于改变数组的第0个元素的值; 为什么不*(*(p+0)+0)=0因为main()函数*(*(num+0)+0)用于改变第0个元素的值? 整件事对我来说很困惑,但无论如何我必须要理解它。 我已经搜索了这个,发现指向数组的指针和指向指针之间有区别,但我无法理解。

将函数指针设置为静态地址

我正在将DLL注入另一个进程,并希望根据它的地址(0x54315)调用该二进制文件中的函数。 我怎样才能实际声明一个函数,然后将其设置为该地址? #define FUNC 0x54315 void *myFuncPtr; int main() { myFuncPtr = FUNC; // pretty sure this isn’t how myFuncPtr(); // call it? }

将c ++ lambda传递给旧的c函数指针

我必须为旧的c库创建一个c ++包装器。 在类方法中,我必须调用ac函数,它接受其他东西也是函数指针(它是一个事件处理程序,该函数接受一个事件发生时触发的函数)。 一个简单的例子是: void myclass::add_handler(std::function handler, otherstuff…) { /* * Many things. */ type_of_function_pointer_accepted_by_old_c_library_add_handler nameofvariable = [handler](same_arguments_as_in_definition_of_the_old_c_function_pointer_accepted) { /* * Many other things with other stuff to be done before the * handler but always only when fired and not when myclass::add_handler is called. */ handler(); }; old_c_library_add_handler(nameofvariable); /* * Last things. */ } […]

是否有替换typedef函数指针的语法?

为了为函数指针做一个typedef,我们做这样的事情, typedef int (*func) (char*); typedef struct{ char * name; func f1; } 与此相反,我遇到了一个我不明白的代码。 typedef int rl_icpfunc_t (char *); typedef struct { char *name; /* User printable name of the function. */ rl_icpfunc_t *func; /* Function to call to do the job. */ char *doc; /* Documentation for this function. */ }COMMAND; 这是libedit库示例的代码片段。 有人可以向我解释一下吗?

带有未确定参数的函数指针

我想要一个可以采用各种类型参数的函数指针。 我怎么做? 下面的例子(第1行),我希望void (*fp)(int)能够取得void (*fp)(char*) 。 下面的代码没有正确编译,因为我传递char * where int是预期的,所以编译下面的代码会给你警告(并且将无法正常工作)。 void callIt(void (*fp)(int)) { (*fp)(5); } void intPrint(int x) { printf(“%d\n”, x); } void stringPrint(char *s) { printf(“%s\n”, s); } int main() { void (*fp1)(int) = intPrint; callIt(fp1); void (*fp2)(char*) = stringPrint; callIt(fp2); return 0; } 注意:我知道尝试将整数5作为char *参数传递是愚蠢的,但这不是这个问题的关注点。 如果需要,可以用浮点数替换char *。

转换函数指针

我正在编写一个函数,它接收一个指向比较函数和MyStructs数组的MyStructs ,并且应该根据比较函数对数组进行排序: void myStructSort( struct MyStruct *arr, int size, int (*comp)(const struct MyStruct *, const struct MyStruct *)) { qsort(arr, size, sizeof(struct MyStruct), comp); } 不幸的是,这不能编译,因为qsort期望比较器接收void *参数而不是const struct MyStruct * 。 我想到了几个不好的解决方案,并想知道正确的解决方案是什么。 选项1 将comp为int (*)(const void *, const void*) 。 这编译但是未定义的行为(请参阅此SO问题 )。 选项2 创建一个全局变量int (*global_comp)(const struct MyStruct *, const struct MyStruct *)并在myStructSort设置global_comp=comp 。 然后创建一个函数: int […]

什么原因导致编译器警告未使用的函数?

简单设置:有n个函数的原型和函数的实现。 有一大堆函数指针。 每个函数都列在此数组中。 在使用gcc进行编译时,有些仍会导致-Wunused-function。 码: void foo1(void); void foo2(void); void bar1(void); void bar2(void); /* and their implementations */ void (*functions[])(void) = { foo1, foo2, bar1, bar2 }; 这就是设置的样子(仅举例)! 其中一个foo / bar函数现在在使用gcc编译时会导致-Wunused-function警告。 其他人没有。 为什么?