簡體   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