C、C++笔试题集锦 1.doc --- by yangmeng
在模块 B 中引用该函数:
// 模块 B 实现文件 moduleB.cpp
#i nclude "moduleA.h"
foo(2,3);
实际上,在连接阶段,连接器会从模块 A 生成的目标文件 moduleA.obj 中寻找_foo_int_int
这样的符号!
加 extern "C"声明后的编译和连接方式
加 extern "C"声明后,模块 A 的头文件变为:
// 模块 A 头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif
在模块 B 的实现文件中仍然调用 foo( 2,3 ),其结果是:
(1)模块 A 编译生成 foo 的目标代码时,没有对其名字进行特殊处理,采用了 C 语言的方
式;
(2)连接器在为模块 B 的目标代码寻找 foo(2,3)调用时,寻找的是未经修改的符号名
_foo。
如果在模块 A 中函数声明了 foo 为 extern "C"类型,而模块 B 中包含的是 extern int foo( int
x, int y ) ,则模块 B 找不到模块 A 中的函数;反之亦然。
所以,可以用一句话概括 extern “C”这个声明的真实目的(任何语言中的任何语法特性的
诞生都不是随意而为的,来源于真实世界的需求驱动。我们在思考问题时,不能只停留在
这个语言是怎么做的,还要问一问它为什么要这么做,动机是什么,这样我们可以更深入
地理解许多问题):实现 C++与 C 及其它语言的混合编程。
明白了 C++中 extern "C"的设立动机,我们下面来具体分析 extern "C"通常的使用技巧:
extern "C"的惯用法
(1)在 C++中引用 C 语言中的函数和变量,在包含 C 语言头文件(假设为 cExample.h)
时,需进行下列处理:
extern "C"
{
#i nclude "cExample.h"
}
而在 C 语言的头文件中,对其外部函数只能指定为 extern 类型,C 语言中不支持 extern
"C"声明,在.c 文件中包含了 extern "C"时会出现编译语法错误。
C++引用 C 函数例子工程中包含的三个文件的源代码如下:
/* c 语言头文件:cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif
/* c 语言实现文件:cExample.c */
#i nclude "cExample.h"
int add( int x, int y )