繁体   English   中英

体系结构x86_64函数指针的未定义符号

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM