試題4:為什么標(biāo)準(zhǔn)頭文件都有類似以下的結(jié)構(gòu)?
#ifndef __INCvxWorksh #define __INCvxWorksh #ifdef __cplusplus
extern "C" { #endif /*...*/ #ifdef __cplusplus }
#endif #endif /* __INCvxWorksh */ |
解答:
頭文件中的編譯宏
#ifndef __INCvxWorksh #define __INCvxWorksh #endif |
的作用是防止被重復(fù)引用。
作為一種面向?qū)ο蟮恼Z言,C++支持函數(shù)重載,而過程式語言C則不支持。函數(shù)被C++編譯后在symbol庫中的名字與C語言的不同。例如,假設(shè)某個(gè)函數(shù)的原型為:
該函數(shù)被C編譯器編譯后在symbol庫中的名字為_foo,而C++編譯器則會(huì)產(chǎn)生像_foo_int_int之類的名字。_foo_int_int這樣的名字包含了函數(shù)名和函數(shù)參數(shù)數(shù)量及類型信息,C++就是考這種機(jī)制來實(shí)現(xiàn)函數(shù)重載的。
為了實(shí)現(xiàn)C和C++的混合編程,C++提供了C連接交換指定符號(hào)extern "C"來解決名字匹配問題,函數(shù)聲明前加上extern "C"后,則編譯器就會(huì)按照C語言的方式將該函數(shù)編譯為_foo,這樣C語言中就可以調(diào)用C++的函數(shù)了。