轉自:《高質量C/C++編程指南》
幾個同名的重載函數仍然是不同的函數,它們是如何區分的呢?我們自然想到函數接口的兩個要素: 參數與返回值。
如果同名函數的參數不同(包括類型、順序不同),那麼容易區別出它們是不同的函數。如果同名函數僅僅是返回值類型不同,有時可以區分,有時卻不能。例如:
void Function(void);
int Function (void);
上述兩個函數,第一個沒有返回值,第二個的返回值是 int 類型。如果這樣調用函數:
int x = Function ();
則可以判斷出 Function 是第二個函數。問題是在 C++/C 程序中,我們可以忽略函數的返回值。在這種情況下,編譯器和程序員都不知道哪個 Function 函數被調用。所以只能靠參數而不能靠返回值類型的不同來區分重載函數。
編譯器根據參數為每個重載函數產生不同的內部標識符。
例如編譯器為示例 8-1-1 中的三個 Eat 函數產生像_eat_beef、_eat_fish、_eat_chicken 之類的內部標識符(不同的編譯器可能產生不同風格的內部標識符)。
如果 C++程序要調用已經被編譯後的 C 函數,該怎麼辦?
假設某個 C 函數的聲明如下:
void foo(int x, int y);
該函數被 C 編譯器編譯後在庫中的名字為_foo,而 C++編譯器則會產生像_foo_int_int之類的名字用來支持函數重載和類型安全連接。由於編譯後的名字不同,C++程序不能
直接調用 C 函數。C++提供了一個 C 連接交換指定符號 extern“C”來解決這個問題。
例如:
extern “C”
{
void foo(int x, int y);
... // 其它函數
}
或者寫成
extern “C”
{
#include “myheader.h”
... // 其它 C 頭文件
}
這就告訴 C++編譯器,函數 foo 是個 C 連接,應該到庫中找名字_foo 而不是找_foo_int_int。C++編譯器開發商已經對 C 標准庫的頭文件作了 extern“C”處理,所以我們可以用#include 直接引用這些頭文件。
本文轉自CSDN:http://blog.csdn.net/jubincn/article/details/7300141