C++那些细节--extern关键字&&全局变量定义问题

最近在学Lua,关于Lua编译的地方,由于Lua是用C语言写的,在C++中使用C语言的函数,需要使用extern "C“编译才能过,之前貌似没有接触过这方面的知识,写个blog纪念一下,顺便整理一下extern关键字的作用。


一.extern "C"的作用

这是我第一次见,因为之前一直没有过C++去调用 C的函数。关于C++和C语言混合编程其实还有一些地方要注意的。比如,如果编译时出现下面的错误:
error:预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

这是因为C语言和C++的预编译头不同,如果C语言文件较少,可以将C语言文件的属性->预编译头改为不使用预编译头,就可以解决问题啦。


而如果这时候直接在cpp文件中使用C语言的函数,则会出现下面的错误:

>C++Test.obj : error LNK2019: 无法解析的外部符号 "int __cdecl CTest(int,int)" (?CTest@@YAHHH@Z),该符号在函数 _wmain 中被引用。

错误发生在link阶段,连接器没有找到int_cdecl CTest(int int)这个函数,而我们明明写了CTest这个函数。原因是C++和C的编译方式不同,C++支持函数重载,所以在编译的时候,函数名称后面通常会加上一大堆奇葩的东东,一般是记录重载的信息的,具体被编译成什么样需要看编译器的脾气。而C语言不支持

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值