我有認識一些C++的語法與函數指針和函數聲明相結合的問題,那就是:函數指針的說明
通常,當我們要聲明一個類型的功能,我們做一樣的東西:
typedef void(*functionPtr)(int);
這對我來說很好。從現在開始functionPtr是一個類型,代表 指向函數的指針,它返回void並將int作爲參數取值。
我們可以按如下方式使用它:
typedef void(*functionPtr)(int);
void function(int a){
std::cout << a << std::endl;
}
int main() {
functionPtr fun = function;
fun(5);
return 0;
}
而我們得到5
印在屏幕上。
我們得到了指向功能fun
的指針,我們將一些現有的指針分配給函數 - function
,我們通過指針執行這個函數。涼。
現在,當我在某些書中讀到的時候,函數和指向函數的指針在某種程度上是相同的,所以實際上在聲明function()
函數後,我們每次說函數都是指真正的函數和指向相同類型函數的指針,編譯和每個指令給出了相同的結果(5打印屏幕上):
int main() {
functionPtr fun = function;
fun(5);
(*fun)(5);
(*function)(5);
function(5);
return 0;
}
所以現在只要我能想象,那個函數指針和功能幾乎相同,那麼它在某種程度上對我很好。
然後我雖然,如果函數指針和真正的功能是一樣的,那麼爲什麼我不能做如下:
typedef void(functionPtr)(int); //removed *
void function(int a){
std::cout << a << std::endl;
}
int main() {
functionPtr fun = function;
fun(5);
return 0;
}
這給了我以下錯誤:
prog.cpp:12:14: warning: declaration of 'void fun(int)' has 'extern' and is initialized functionPtr fun = function;
所以我的理解,由於某種原因,編譯器現在可以理解,那有趣的是已經存在的函數。然後,我嘗試以下方法:
int main() {
functionPtr fun;
fun(5);
return 0;
}
而且出現鏈接錯誤。我以某種方式理解,作爲編譯器現在將樂趣視爲已經存在的函數,然後由於事實,樂趣無處定義,我會得到鏈接錯誤。在主陰影所以現在
typedef void(functionPtr)(int);
void function(int a){
std::cout << a << std::endl;
}
int main() {
functionPtr function;
function(5);
return 0;
}
功能全局命名功能,因此function(5)
從聲明functionPtr function;
使用它在屏幕上正常工作和印刷5:所以我改變了變量的名稱。
所以現在我感到震驚。爲什麼發生這種情況?此外誤導的事情是,當函數指針聲明如下:
typedef void(*functionPtr)(int);
我可以按以下方式創建類型functionPtr的功能:
functionPtr function(int a){
std::cout << a << std::endl;
}
然而,聲明是這樣的時候:
typedef void(functionPtr)(int);
使得這個:
functionPtr function(int a){
std::cout << a << std::endl;
}
被編譯器解釋爲函數返回函數。如果是這樣,爲什麼之前的聲明(typedef void(functionPtr)(int);
)知道,這是一個函數返回void而不是函數返回functionPtr?
有人能解釋一下真正發生在我身上的事嗎?
我在啓用C++ 14選項時使用了g ++ C++編譯器。
這段代碼沒有編譯。這段代碼是: 'functionPtr fun; (0);'(沒有任務) 這裏的樂趣被看作是一些函數,那個地方存在,但鏈接無法看到它,所以我得到鏈接錯誤 – DawidPi
因此,爲什麼當'typedef void(functionPtr)(int); '是這樣的,我有: functionPtr樂趣;有趣();我得到鏈接錯誤?看到這裏:https://ideone.com/e20FmU – DawidPi
@DawidPi因爲,正如SergeyA很好地解釋,代碼是不正確的。只能在這個答案中發佈的情況下實現函數功能。在你的情況下,樂趣不是。 – LPs