[英]Undefined symbols for architecture x86_64 function pointers
我正在尝试在“函数指针如何在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!");
}
(与答案相同)。
这与x86_64架构,功能无关
char* getString(const void* self);
void setString(const void* self, char* value);
int lengthString(const void* self);
被声明但从未定义。
编译会成功,因为编译器并不需要知道这些功能实际上是1,只需要知道他们存在,他们的签名进行类型检查。 链接器的工作是在要链接的任何目标文件中找到这些功能。
由于无处定义,因此链接失败。
您从此代码中获得的答案只是关于如何在C中实现OOP的展示。
该代码无意于运行,实现细节(如上述功能的定义)留给读者。
在复制粘贴代码之前,您应该始终阅读完整的答案,并且在任何情况下都不要使用您不完全理解的代码。
此外,请始终查看注释。
答案实际上是关于如何实现OOP的,这是非常不准确的,函数指针不在实现方法中使用(除非它们是虚拟的),因为类型是静态的并且在编译时是已知的(调用的方法也是如此,不需要使用)函数指针)。
函数指针在概念上与普通指针或数组没有什么不同,所有这些类型都使您可以根据另一个变量(种类为元变量)的值访问其他变量。
您可以想象所有函数都有一个唯一的(在整个过程中)与之关联的数字,而函数指针只是可以容纳这些数字的变量。
调用时,函数指针将检索与其当前拥有的编号关联的函数并执行它。
为了使类型安全最少,函数指针(如普通指针)带有函数签名。
1在这种情况下,它们具有external
链接,因此编译器甚至不会警告缺少定义,因为它希望该定义位于另一个翻译单元中。 即使它们具有static
链接(即标准语言中的内部链接),也允许前向声明,因此语法仍然有效(尽管GCC会发出警告)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.