2009-06-03 47 views
1

我在Py ++生成的C++程序中有一個奇怪的typedef語句。如何調用指向函數的指針而不需要解引用?

double radius(int); // function to be wrapped 
typedef double (*radius_function_type)(int);  
bp::def("radius", radius_function_type(&radius)); // bp::def is a function for wrapping 

我想通些什麼到目前爲止,上述的typedef statemnt不是類型的,我們大多數人都熟悉,

typedef complex_type simple_alias; 

相反,它是聲明指向函數的方式它將int作爲參數並返回double(與原型相同)。所以我現在的問題是,如何指向一個功能(沒有取消引用)叫做,函數的地址作爲參數?這也與原型不匹配。有人請解釋!

回答

3

你的問題很混亂。你問這是什麼一樣:

radius_function_type(&radius)" 

這僅僅是一個C++類型轉換,有點像:

radius (int (42)); 

但由於半徑已經是類型radius_function_type那麼你可以很容易地做到:

bp::def("radius", radius); 

但由於這是由Py ++生成的代碼,因此可能會對輸出格外小心。

+1

更像是C風格的類型轉換。 C++有static_cast,dynamic_cast等 – crashmstr 2009-06-03 13:05:28

2

嗯......這與C和C++中與數組如何與指針相關有點相似。函數的名字基本上也是一個指針。從這個角度看,這不是太奇怪,給出一個定義:

int foo(int a, int b) 
{ 
    return a + b; 
} 

你可以做的通話直接通過指針是函數的名稱:

foo(1, 2); 

或通過存儲值在一個單獨的變量,必須聲明爲指針:

int (*pointer)(int, int) = foo; 
pointer(1, 2); 

在這種情況下,我們可以通過指針變量直接調用,而且也沒有必要明確「取「該函數的地址通過編寫&foo

+0

非常感謝您的及時回覆。但是仍然沒有解釋的是,radius_function_type(&radius)中的參數是函數的地址,它與原型不匹配。請在這個問題上點亮一下! – Aamir 2009-06-03 12:46:01

+1

@Aamir:&radius和radius都作爲指向函數的指針。由於函數不是C++中的第一類對象,除了通過指針指向函數之外,沒有辦法使用函數,所以語言只是讓你做任何你想要的。函數名稱的這種行爲與變量相反:如果您全局聲明一個整數my_int,那麼my_int和&my_int是完全不同的東西。實際上, – 2009-06-04 10:31:02

1

解引用(以您認爲的方式)函數的指針意味着:訪問代碼存儲器,因爲它將是數據存儲器。

函數指針不能用這種方式解除引用。相反,它被調用。

我會使用名稱「dereference」與「call」並排。沒關係。

反正:C被設計以這樣的方式,這兩個函數名標識符以及變量保持功能的指針的意思是相同:地址代碼存儲。它允許通過在標識符或變量上使用call()語法跳轉到該內存。

6

它不聲明函數指針變量,但一個函數指針的typedef叫radius_function_typeradius_function_type(&radius)只是函數指針本身的一個(冗餘)強制轉換。 (一元&地址的運營商也是多餘的;對於一個功能,radius&radius是相同的東西。)

在一個低的水平,調用一個函數只是放置參數某處根據基礎調用約定(通常在堆棧上),然後跳轉到內存地址。因此,如果編譯器知道函數指針類型(函數簽名)和指針值本身,則可以使用指針調用函數。

1

函數指針基本上是需要調用的函數的地址。要調用函數指針所指向的函數,您可以將函數指針視爲您希望調用的函數的名稱。稱之爲自己的行爲會執行解除引用;不需要明確的解除引用。

函數指針語法可能看起來像指針(與&和*)或者也可以省略。正如@unwind已經指出的,它類似於數組如何處理裸數組類似於指針,並且可以選擇以&爲前綴來獲取地址。

相關問題