2016-12-25 119 views
0

我正在尝试在'如何做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!"); 
} 

(在相同的答案)。

+3

你真的没有getString ...我想你忘了添加/写入这些功能? – xosp7tom

+0

你能否提供一个'C函数指针如何工作'的链接?(它可能已被重命名/删除?) – pseyfert

+0

http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work – Teun

回答

0

这有什么好做的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发出警告)。

相关问题