我如何安静C编译器关于函数指针需要任意数量的参数?

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)

但是如果可以避免,我宁愿不用标志来禁用编译器警告.

所以我的问题是:我如何在代码中注释这个函数指针,使编译器满意它接受任意数量的任何类型的参数这一事实?

代码完美无缺.我只想让警告消失.

dus*_*uff 5

将指针存储为a void *并在必要时强制转换为相应的函数指针类型?请记住,将一种类型的函数指针调用为另一种类型并不一定安全,因此您开始使用的警告并非完全无效.

您可以像这样强制转换函数指针:

void *genericPointer = ...;
void (*fp)(int, int) = genericPointer;
fp(123, 456);
Run Code Online (Sandbox Code Playgroud)

注意:

  • 这里没有必要进行显式转换,因为void *总是可以转换为任何指针类型.
  • 之前的初始"void" (*fp)是函数指针的返回类型.

  • `void*`可以转换为任何_object_指针类型.它无法转换为函数指针类型.符合标准的编译器将诊断示例代码的第二行的错误. (5认同)