在c++程序中调用被C编译器编译后的函数,为什么要使用extern “C”
来源:互联网 发布:淘宝评价是怎么排序的 编辑:程序博客网 时间:2024/05/16 13:53
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文件中找到该函数;
- 在c++程序中调用被C编译器编译后的函数,为什么要使用extern “C”
- 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern
- 在C++中调用被C编译器编译后的函数,为什么要加extern "C"
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 经典面试题目--在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 在C++ 程序中调用被C编译器编译后的函数,为什么要加extern “C”?
- 在C++程序中调用被c编译器编译后的函数,为什么要加extern "C"?
- 在C++程序中调用被C 编译器编译后的函数,为什么要加 extern "C"
- 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
- 实验5
- eclipse下的项目上出现红色叹号解决
- 读书笔记-《深入理解Java虚拟机》-GC对象判定算法
- UIFramework之Unity4.x 资源加载策略
- php命名空间
- 在c++程序中调用被C编译器编译后的函数,为什么要使用extern “C”
- Linux中/etc/passwd、/etc/shadow、/etc/group文件介绍
- jsp传统标签开发
- Android AsyncTask简介
- 爬取广东国家税务局信息公开部分
- Java多线程(四)
- 解决可视区化布局方案
- Redis常用的30个命令
- STL容器及排序问题