实验:验证VC++6.0在C/C++混编时对变量的处理

工程中有如下文件:

foo.cpp

main.cpp

TstExtn.c

TstExtn.h

报错如下:

TstExtn.obj : error LNK2001: unresolved external symbol _XinCPP

显然TstExtn.c中的XinCPP找不到定义了!

但是请注意,foo.cpp中XinCPP能找到在main.cpp中的定义!

原因:

(1)全局变量XinCPP定义在cpp文件中;

(2)TstExtn.h中要求其按照C的方式命名;

(3)TstExtn.c中使用XinCPP,它按照TstExtn.h中要求的C名称去找该变量,不可能找到!

因为main.cpp中的XinCPP按照C++的方式命名;

-----------------------------------------------------------------------------------------------

此时只要将main.cpp中的#include "TstExtn.h"注释打开,

同时,将foo.cpp中的

    extern int XinCPP;

删去,并添加

    #include "TstExtn.h"

整个程序就可编译、链接通过!

    究其原因则是,TstExtn.h中包含了extern "C"指令符,指定XinCPP按照C的方式链接,

该声明位于定义

    int XinCPP = 0;

之前,所以main.cpp中XinCPP在链接符号表中亦是一个以C方式命名的全局变量。

这样无论是TstExtn.c中XinCPP还是foo.cpp中XinCPP,

都是以#include "TstExtn.h"的方式获得XinCPP的声明,

就都统一到main.cpp中这个以C方式命名的全局变量底下来!!!

-----------------------------------------------------------------------------------------------

接着删去foo.cpp中的

    #include "TstExtn.h"

而改成

    extern int XinCPP;

此时报错

foo.obj : error LNK2001: unresolved external symbol "int XinCPP" (?XinCPP@@3HA)

究其原因是因为foo.cpp中XinCPP,以extern int XinCPP;的方式获得XinCPP的声明。

这在一个CPP文件中如此声明,则编译时,该文件中的XinCPP皆会以C++的命名方式命名。

可是,main.cpp中该变量定义为一个C方式命名的全局变量,自然在链接时,会报错foo.cpp中的XinCPP找不到定义!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值