结构体函数指针赋值编译报错:为何单独赋值失败而初始化列表可行?
问题:结构体函数指针成员单独赋值编译失败
我尝试将结构体用作函数容器,但遇到了编译错误。以下是methods结构体的定义:
typedef struct { void (*addAtHead)(LinkedList*,int); void (*addAtTail)(LinkedList*,int); void (*remFromHead)(LinkedList*); void (*remFromTail)(LinkedList*); }methods;
我尝试给methods类型变量LinkedListF的成员函数指针单独赋值:
methods LinkedListF; LinkedListF.addAtHead = addAtH; LinkedListF.addAtTail = addAtT; LinkedListF.remFromHead = remFromH; LinkedListF.remFromTail = remFromT;
预期调用LinkedListF.addAtHead(LinkedList *l,int value)会执行addAtH,但编译时出现错误:
LinkedList.c:43:12: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token 43 | LinkedListF.addAtHead = addAtH; ....and more errors
我确认没有遗漏分号或其他语法错误,而使用初始化列表赋值则能正常编译:
methods LinkedListF = {addAtH,addAtT,remFromH,remFromT};
请问我哪里出错了?
原因与解决方法
问题出在代码的作用域上:你把LinkedListF.addAtHead = addAtH;这类赋值语句直接写在了函数外部(全局作用域),但C语言的语法规则不允许在全局作用域中执行单独的赋值操作——全局变量只能在定义时通过初始化列表完成赋值,后续的赋值语句必须放在函数内部(比如main函数、专门的初始化函数)。
解决方式二选一:
- 将赋值语句移入函数内部:
methods LinkedListF; // 全局变量声明 void initLinkedListMethods() { LinkedListF.addAtHead = addAtH; LinkedListF.addAtTail = addAtT; LinkedListF.remFromHead = remFromH; LinkedListF.remFromTail = remFromT; } int main() { initLinkedListMethods(); // 调用初始化函数 // 后续正常使用LinkedListF的成员 return 0; }
- 继续使用初始化列表:
保持你已经验证可行的写法,在定义LinkedListF时直接用初始化列表完成函数指针的赋值:
methods LinkedListF = {addAtH,addAtT,remFromH,remFromT};
内容的提问来源于stack exchange,提问作者srajan0149
相关产品推荐
相关产品推荐

