2009-02-07 87 views

回答

23

你不能。它內置於編譯器中,可以讓你重載函數,並在不同的類和類似的東西中使用同名的函數。但是你可以編寫像C函數一樣的函數。這些可以從C代碼中調用。但是,這些不能超載,不能由「正常」 C++函數指針調用:

extern "C" void foo() { 

} 

上述功能將像C函數編譯器被截斷。這可能根本不包括名稱的變化,或者一些變化,比如前面的「_」。

+0

只是次要NIT:這樣的功能當然可以選自C被稱爲++函數指針:外部的 「C」 空隙FOO(){printf的( 「富\ n」); } int main(){ void(* f)(); f = foo; f(); } – 2009-02-07 23:03:43

6

其他方式:

控制名稱中使用的彙編代碼gcc spec.

您可以指定名稱在彙編代碼可用於C函數或可變的寫作聲明者之後的asm(或__asm__)關鍵字。您應該確保您選擇的彙編程序名稱不與任何其他彙編程序符號或引用寄存器衝突。

爲函數指定的彙編名,寫出它的定義之前的函數的聲明,並把ASM那裏,就像這樣:

int func() asm ("MYFUNC"); 

int func() 
{ 

g++將編譯並nm -D輸出將

0000000000001e02 T MYFUNC 

,而不是

0000000000001e02 T _Z4funcv 

測試對於g ++ 4.9.2