gpt4 book ai didi

c - 体系结构 x86_64 函数指针的 undefined symbol

转载 作者:行者123 更新时间:2023-11-30 16:52:17 25 4
gpt4 key购买 nike

我正在尝试“函数指针在 C 中如何工作”问题中听到的示例之一,但我陷入了架构 x86_64 错误的 undefined symbol 。

完整日志:

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,它只需要知道它们存在以及它们的签名来执行类型检查。链接器的工作是在任何被链接的目标文件中查找这些函数。
由于它们没有被定义,因此链接失败。

<小时/>

answer you took this code from只是展示如何在 C 中实现 OOP。
代码并不打算运行,实现细节(如上面函数的定义)留给读者。
在复制粘贴代码之前,您应该始终阅读完整的答案,并且在任何情况下都不要使用您不完全理解的代码。
另外,一定要看看评论。

对于 OOP 的实现方式,答案实际上非常不准确,函数指针不用于实现方法(除非它们是虚拟的),因为类型是静态的并且在编译时已知(调用的方法也是如此,而不是需要使用函数指针)。

函数指针在概念上与普通指针或数组没有什么不同,所有这些类型都允许您根据另一个变量(一种元变量)的值访问其他变量。
您可以想象所有函数都有一个与其关联的唯一(在整个进程中)数字,并且函数指针只是一个可以保存这些数字的变量。
调用时,函数指针将检索与其当前保存的数字关联的函数并执行它。
为了达到最低程度的类型安全,函数指针与普通指针一样,带有函数签名。

<小时/>

1 在这种情况下,它们具有 external 链接,因此编译器甚至不会警告定义的缺失,因为它期望定义位于另一个翻译单元中。即使它们具有静态链接(即标准语言中的内部链接),也允许前向声明,因此语法仍然有效(尽管 GCC 会发出警告)。

关于c - 体系结构 x86_64 函数指针的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41322256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com