我正在尝试在'中如何使用C'中的函数指针。问题,我遇到了架构x86_64错误的未定义符号。
完整日志:
Undefined symbols for architecture x86_64:
"_getString", referenced from:
_newString in main-3adb06.o
"_lengthString", referenced from:
_newString in main-3adb06.o
"_setString", referenced from:
_newString in main-3adb06.o
ld: symbol(s) not found for architecture x86_64
我使用的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct String_Struct* String;
struct String_Struct
{
char* (*get)(const void* self);
void (*set)(const void* self, char* value);
int (*length)(const void* self);
};
char* getString(const void* self);
void setString(const void* self, char* value);
int lengthString(const void* self);
String newString();
String newString()
{
String self = (String)malloc(sizeof(struct String_Struct));
self->get = &getString;
self->set = &setString;
self->length = &lengthString;
self->set(self, "");
return self;
}
int main(){
String s1 = newString();
s1->set(s1, "Hello, World!");
}
(与答案相同)。
答案 0 :(得分:0)
这与x86_64架构,函数
无关char* getString(const void* self);
void setString(const void* self, char* value);
int lengthString(const void* self);
已声明但从未定义。
编译将成功,因为编译器不需要知道这些函数实际上在哪里 1 ,它只需要知道它们存在以及它们的签名来执行类型检查。 链接器的任务是在链接的任何目标文件中找到这些函数 由于它们是无处定义的,因此链接失败。
answer you took this code from只是展示了如何在C中实现OOP
代码不是为了运行,实现细节,如上面函数的定义,留给读者
在复制粘贴代码之前,您应该始终阅读完整的答案,并且在任何情况下都不要使用您不完全理解的代码。
此外,请务必查看评论。
答案实际上是非常不准确的OOP如何实现,函数指针不用于实现方法(除非它们是虚拟的)因为打字是静态的并且在编译时是已知的(所以调用的方法也是如此)需要使用函数指针)。
函数指针在概念上与普通指针或数组没有任何区别,所有这些类型都允许您根据另一个变量(元变量的类型)的值访问其他变量。
你可以想象所有函数都有一个唯一的(在整个过程中)与它们相关联的数字,并且函数指针只是一个可以容纳这些数字的变量。
调用时,函数指针将检索与其当前持有的数字相关联的函数并执行它
为了最小化类型安全,函数指针,如普通指针,带有函数签名。
1 在这种情况下,它们具有external
链接,因此编译器甚至不会警告缺少定义,因为它期望它在另一个翻译单元中。即使它们具有static
链接(即标准中的内部链接),也允许使用前向声明,因此语法仍然有效(尽管GCC会发出警告)。