25.2.3 和C代码链接(2)
例如,在下面的代码中,doCFunction()的函数原型指定为一个外部C函数:
- extern "C" {
- void doCFunction(int i);
- }
- int main()
- {
- doCFunction(8); // Call the C function.
- return 0;
- }
doCFunction()函数的实际定义在一个编译好的二进制文件中,链接的时候附上这个文件。extern关键字告诉编译器,链入的代码是使用C语言编译的。
使用extern的一个更常见的模式是在头文件的层次使用。例如,如果您在使用一个用C语言编写的图形库,这个库可能带有一个供您使用的.h文件。您可以编写另一个头文件,将原来的头文件包含在extern块中,表示整个头文件定义的函数都是用C编写的。包装的.h文件通常以.hpp命名,以便和C版本的头文件区分:
- // graphicslib.hpp
- extern "C" {
- #include "graphicslib.h"
- }
另一个常见模型是单独写一个头文件,并且通过条件编译选择C或C++(www.cppentry.com)的部分。如果正在为C++(www.cppentry.com)编译,C++(www.cppentry.com)编译器会预定义一个符号__cplusplus。编译C的时候没有定义这个符号。所以您经常会看到以下形式的头文件: - #ifdef __cplusplus
- extern "C" {
- #endif
- declaration1();
- declaration2();
- #ifdef __cplusplus
- } // matches extern "C"
- #endif
这意味着declaration1()和declaration2()是C语言编译器编译的库中的函数。使用这种技术,C语言和C++(www.cppentry.com)的客户可以使用同一个头文件。
不论您是在C++(www.cppentry.com)程序中包含C代码,还是链接C语言编译的库,要记住,尽管C++(www.cppentry.com)是C语言的超集,这两种语言实际上是设计目标不同的不同语言。在C++(www.cppentry.com)中采用C语言代码是很常见的,但是给过程式的C语言代码提供面向对象的C++(www.cppentry.com)封装是更好的选择。