C - 带有函数指针的struct,如何修复“变量数量的参数”警告?

时间:2018-02-18 12:47:15

标签: c function pointers struct arguments

我正在尝试摆脱warning: assignment from incompatible pointer type [-Wincompatible-pointer-types],同时在这个处理庞大的开源C库的简化示例中添加func2 - 它具有很多功能,如func1和定义如str1.func = func1;。是否可以修改此警告而无需修改func1或为每个函数编写特定内容/其'定义?

此代码在OnlineGDB - https://onlinegdb.com/ry5rNlvDG,点击“分叉”修改

#include <stdio.h>

void func1(int a) { // please don't change
    printf("%i\n", a);
}

void func2(int a, char c) {
    printf("%i - %c\n", a, c);
}

struct bigstruct {
    // void (*func) (int a); // old way
    void (*func) (int a, char c); // ??? - some magic needed
};

int main()
{ 
    struct bigstruct str1, str2;

    str1.func = func1; // please don't change
    // ^^^ gives a warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
    str2.func = func2;

    error; // onlinegdb - error on purpose to see the warnings
}

UPDATE:最终我发现这确实是不可能的,但我只是通过在一个函数中通过这个开源库传递一个新字段来摆脱这种情况到另一个,结果没有为函数添加新的参数。我为“他的最佳尝试”给出了“@Rarity”的最佳答案

2 个答案:

答案 0 :(得分:0)

随着你的“请不要改变”,这是不可能的。但是,你可以做一个演员:

str1.func = (void(*)(int, char))func1;

该函数将使用2个参数调用,但只需要一个。在Intel和VC上,第二个参数将被忽略。 (参数从右向左推入堆栈,func1将只访问第一个参数,并且不会意识到堆栈中更高的任何其他参数。在其他架构上可能会有所不同。

答案 1 :(得分:0)

我不太关心你的问题,如果它发出警告,那么-Wno-incompatible-pointer-types可能就行了。

否则,如果要有选择地抑制警告,请将func声明更改为:

struct bigstruct {
    void (*func) ();
};

,然后func将接受各种函数指针。 C中的void ()()类型是&#34;函数,它接收未知数量的未知参数(并且不返回任何内容)&#34;,与void()(void)不同,它是&#34;一个不带参数的函数&# 34。