C代码编译报错:被调用对象非函数/函数指针等问题求助
首先明确:FUNC是宏定义,不是函数指针——函数指针是C的一种数据类型,不会以这种宏调用的形式出现在声明里。你的编译错误完全是因为宏的使用或者宏定义本身写错了,导致生成了非法的C语法。
第一个错误的根源
你头文件里的extern FUNC(void, MY_CODE) MyLatestUpdate()(void);完全不符合C语法:MyLatestUpdate()(void)这种“函数后面跟括号”的写法是非法的,C里没有这种语法。这说明FUNC宏的展开结果或者你的使用方式完全错了。
假设这个宏原本是用来声明返回函数指针的函数(常见于回调注册或动态函数场景),正确的C原生声明应该是:
extern void (*MyLatestUpdate(void))(void);
这个声明的意思是:MyLatestUpdate是一个无参数函数,返回值是一个“无参数、返回值为void的函数指针”。
如果要用宏简化这种声明,宏应该写成:
#define FUNC(ret_type, tag) ret_type (*tag(void))(void)
然后头文件里的声明改成:
extern FUNC(void, MyLatestUpdate);
这样宏展开后就是合法的C代码,不会触发第一个编译错误。
如果FUNC原本是用来定义函数指针类型,那宏应该是:
#define FUNC(ret_type, tag) ret_type (*tag)(void)
这时候如果MyLatestUpdate是一个函数指针变量,声明应该是:
extern FUNC(void, MyLatestUpdate);
第二个错误的解决
main里的“called object is not a function or function pointer”错误,本质是你调用的MyLatestUpdate不是函数/函数指针类型。比如如果声明错误把它定义成了普通变量,调用自然会报错。
按照修正后的声明,调用方式要对应调整:
- 如果
MyLatestUpdate是返回函数指针的函数,需要先拿到它返回的函数指针再调用:
或者直接链式调用:void (*update_func)(void) = MyLatestUpdate(); update_func();MyLatestUpdate()(); - 如果
MyLatestUpdate是函数指针变量,需要先给它赋值一个符合类型的函数地址,再调用:// 先定义一个匹配类型的函数 void actual_update(void) { // 你的业务逻辑 } // 给函数指针赋值 MyLatestUpdate = actual_update; // 调用 MyLatestUpdate();
额外建议
如果能找到FUNC宏的原始定义,直接修正宏的使用方式会更准确。如果找不到,先按照常见的函数指针/返回函数指针的场景调整声明和调用,确保语法合法。
内容的提问来源于stack exchange,提问作者user2986042

