体系结构x86_64函数指针的未定义符号
问题描述:
我正在尝试在'如何做C函数指针工作'问题中侦听的示例之一,并且我正在用于体系结构x86_64错误的未定义符号中。体系结构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);
已宣告但从未定义。
编译会成功,因为编译器不需要知道这些函数实际上在哪里,它只需要知道它们存在以及它们的签名来执行类型检查。 链接器的任务是在链接的任何对象文件中查找这些函数。
由于它们没有定义,链接失败。
的answer you took this code from就是如何在C.
实现OOP一个展示的代码是不打算运行,实施细则,就像上面的函数的定义,都留给了读者。
在复制粘贴代码之前,您应该始终阅读完整答案,并且在任何情况下都不要使用您不完全了解的代码。
此外,总是看看评论。
对于如何实现OOP,答案实际上是非常不准确的,函数指针不用于实现方法(除非它们是虚拟的),因为键入是静态的并且在编译时已知(也是调用方法,不需要使用函数指针)。
函数指针在概念上与普通指针或数组没有任何区别,所有这些类型都允许您根据另一个变量(类型的元变量)的值访问其他变量。
您可以想象,所有函数都具有与它们相关的唯一(在整个过程中)数字,并且函数指针只是一个可以容纳这些数字的变量。
当被调用时,函数指针将检索与它当前拥有的数字相关的函数并执行它。
为了保证类型安全,函数指针和普通的指针一样,带有一个函数签名。
在这种情况下它们具有external
联动所以编译器甚至不会警告没有定义的,因为它希望它是在另一翻译单元。即使它们有static
链接(即标准内部链接),也允许前向声明,所以语法仍然有效(尽管GCC发出警告)。
你真的没有getString ...我想你忘了添加/写入这些功能? – xosp7tom
你能否提供一个'C函数指针如何工作'的链接?(它可能已被重命名/删除?) – pseyfert
http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work – Teun