在c++程序中调用被C编译器编译后的函数,为什么要使用extern “C”

30 篇文章 1 订阅

c/c++函数调用约定:c/c++函数调用约定
一、原题:
这里写图片描述
二、详细说明:
现在,在一个工程中;有一个test.c文件;一个test1.cpp文件;

//test.c

#include<stdio.h>

int Add(int a,int b)
{
    return a+b;
}

(1)使用extern int Add(int,int);声明外部函数—–错误
//test1.cpp

#include<iostream>
using namespace std;
extern int Add(int,int);//声明外部test.c中的函数
int main()
{
    cout<<Add(50,50)<<endl;
    return 0;
}

运行结果:错误
错误:1>test.obj : error LNK2019: 无法解析的外部符号 “int __cdecl Add(int,int)” (?Add@@YAHHH@Z),该符号在函数 _main 中被引用

解释:

c语言程序和c++程序在编译时,是相互独立的编译;在.c文件中,编译器将Add函数重命名为_Add; 而在.cpp文件中,编译器将用extern声明的函数重命名为(?Add@@YAHHH@Z);那么在链接阶段,在_mian函数中该Add函数被调用;
此时编译器带着(?Add@@YAHHH@Z)函数名进入test.c文件的编译文件中去寻找(?Add@@YAHHH@Z)函数,但是在test.c文件中这个Add函数被编译器重命名为_Add,由于在.cpp文件中和.c文件中同一个函数名被编译器重命名后的名字不一样;所以.cpp文件声明的外部函数找不到真正定义的地方;程序错误;
(2)使用extern "C" int Add(int,int); 外部函数—-正确

#include<iostream>
using namespace std;
extern "C" int Add(int,int);
int main()
{
    cout<<Add(50,50)<<endl;
    return 0;
}

解释:
c++语言为了支持重载,对编译时函数的重命名规则进行更改,
使用extern “C” 的方式在c++程序中声明c语言文件中的函数,可以在编译时,告诉编译器使用C语言的规则对该函数的的函数名的进行重命名,这样在链接的时候,就可以顺利在.c文件中找到该函数;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值