Cor*_*son 5 c pointers function compiler-warnings
我有一个函数指针struct,它在运行时动态设置为我的代码中不同位置的另一个函数的地址.它在我的头文件中定义如下:
void *(*run)();
Run Code Online (Sandbox Code Playgroud)
在编译期间,我收到以下警告:
warning: function declaration isn't a prototype
Run Code Online (Sandbox Code Playgroud)
这个警告是良性的,因为指针在我的代码中的许多地方用来调用它指向的函数,一切正常.但是,我真的想沉默警告.
如果我改成它:
void *(*run)(void);
Run Code Online (Sandbox Code Playgroud)
我使用它时会出现编译错误,因为使用指针的各种函数具有不同数量的参数,并且说void在括号内部告诉编译器它不接受任何参数.
我不能使用va_list或类似的任何东西,因为这只是指向另一个函数的指针,我使用单个指针,因为它保持代码干净和简单.
我可以通过将此添加到我的编译器标志来使警告静音:
-Wno-strict-prototypes
Run Code Online (Sandbox Code Playgroud)
但是如果可以避免,我宁愿不用标志来禁用编译器警告.
所以我的问题是:我如何在代码中注释这个函数指针,使编译器满意它接受任意数量的任何类型的参数这一事实?
代码完美无缺.我只想让警告消失.
将指针存储为a void *并在必要时强制转换为相应的函数指针类型?请记住,将一种类型的函数指针调用为另一种类型并不一定安全,因此您开始使用的警告并非完全无效.
您可以像这样强制转换函数指针:
void *genericPointer = ...;
void (*fp)(int, int) = genericPointer;
fp(123, 456);
Run Code Online (Sandbox Code Playgroud)
注意:
void *总是可以转换为任何指针类型.(*fp)是函数指针的返回类型.