C與C++函式的不同特性
C與C++函式最大的不同點在於——C++函式可以過載,即幾個函式的函式名可以相同,但是引數型別或引數個數必須不同;而C函式在一個環境中不能同名。這其中可以引申出關於為什麼C++的型別安全機制比C更好的原因。先請看下面的程式碼:
#include <stdio.h>
void Hi(void)
{
puts("Hi");
}
void test(void)
{
void *p = &Hi;
(*(void(*)(void))p)();
}
上面是一段C程式碼。我們可以看到test()函式中有一個void指標指向Hi函式,這不會有任何問題(沒有error和warning)。
下面再看一段C++程式碼:
using namespace std;
void Hello(void)
{
cout << "Hello, world!" << endl;
}
void Hello(int i)
{
cout << "The data is: " << i << endl;
}
extern "C" void test(void);
int main(void)
{
void(*p)(void) = &Hello;
(*p)();
void *q = (void*)(unsigned long)(void(*)(int))&Hello;
(*(void(*)(int))q)(10);
test();
return 0;
}
我們看到這段程式碼中有兩個Hello()函式,一個帶有一個型別為void的引數,而另一個帶有一個型別為int的引數。我們看main()函式的第一句:void(*p)(void) = &Hello;這句語句沒有問題。因為C++編譯器與C編譯器不同,在這種情況下,編譯器將根據左運算元的型別去跟有運算元的型別進行比較,因為Hello()函式集合中確實存在(void(*)(void))型別的函式,因此匹配成功。
如果是void *p = &Hello;那麼編譯器肯定出錯。我們可以簡單地理解為編譯器無法識別所取的Hello函式的地址到底是哪一個。其實利用上述思路我們應該正確地理解為:由於編譯器無法在Hello集合中找到void*型別與左運算元的型別進行匹配,所以編譯器會報錯。
解決這個問題的方法就是通過多次的型別強制轉換。這裡還有一個GCC系列編譯器的問題。該系列的編譯器規範指出,void*型別的指標不能指向函式,因此如果單純地強制轉為(void(*)(int))編譯器會有warning,所以這裡先轉為(void(*)(int)),然後再轉為(unsigned long),最後再轉為(void*),這樣就不會產生warning。
而C語言編譯器不會有型別查詢,它直接比較左運算元和有運算元的型別一致性問題,並且放得很寬。
相關文章
- C++ 引用和函式的高階特性C++函式
- fill函式與memset函式的區別(c++)函式C++
- C++中函式指標與函式物件C++函式指標物件
- c++ for_each()與仿函式C++函式
- C++的函式式革命C++函式
- C++函式C++函式
- 【C++】函式C++函式
- c++的remove函式C++REM函式
- C++中的虛擬函式與虛擬函式表 (轉)C++函式
- C/C++—— C++中函式重寫和函式過載C++函式
- C++的函式和模板函式 (轉)C++函式
- C++程式中不同函式呼叫方式的彙編碼比較C++函式
- C與C++在函式和資料的比較C++函式
- linux與windows下C++的sleep函式LinuxWindowsC++函式
- 高質量C++/C程式設計指南(第8章 C++函式的高階特性) (轉)C++C程式程式設計函式
- c++ Beep函式C++函式
- c++函式模板C++函式
- C++仿函式C++函式
- C++ Virtual函式C++函式
- C/C++—— C++中建構函式不能是虛擬函式的原因分析C++函式
- C++ 函式 realloc 的用法C++函式
- C++的函式過載C++函式
- C++中的strrev函式C++函式
- C++:純虛擬函式與抽象類C++函式抽象
- Effective C++:類與函式的設計和申明C++函式
- C++的函式的過載C++函式
- C++行內函數、函式過載與函式預設引數C++函數函式
- C++ replace() 函式用法C++函式
- C++中strlen函式C++函式
- C++解構函式C++函式
- C++函式過載C++函式
- c++ 函式指標C++函式指標
- C++之memset函式C++函式
- C++ 序列操作函式C++函式
- 【C++】建構函式C++函式
- C++ 虛擬函式C++函式
- C++建構函式C++函式
- C++ -- TranslateMessage函式C++函式