当前位置:首页 » 《随便一记》 » 正文

C/C++中的 extern 和extern“C“关键字详解(通俗易懂)

4 人参与  2024年09月20日 18:42  分类 : 《随便一记》  评论

点击全文阅读


前言

1、C/C++ extern关键字用法
2、extern "C"用法

正文

1、extern关键字
extern其实就是一个声明,明确指出一个语句是声明,比如extern int i ;这是声明变量i,而不是定义i,定义i则是int i声明不开辟内存空间,而定义是要开辟内存空间的

使用场景1:(适用于简单项目,几个文件之间的调用)
extern可以声明一个变量,表示该变量来自其他文件,在此文件中可以被访问。
比如,目前创建了两个c文件,分别是test.c和main.c,如果在main.c中想获取test.c中的i变量,则只要在main.c的文件中加上这么一行:extern int i

//test.c文件int i =5;
//main.c文件#include <stdio.h>extern int i;int main(){printf("i=%d\n",i);    return 0;}

使用场景2:适合用于大工程
假如我一个大工程,这个工程由超级多的文件,这些文件假如都要访问test.c文件的 变量 i,那么,只能在这些文件中,每个文件的开头都 声明变量 i,并且,假如我的test.c,不止一个定义一个变量i,有好多其他变量呢?在其他文件访问时候,都要声明好多变量,这会使得书写难度很繁琐,并且维护成本也大。

所以,可以把声明语句放到一个头文件中去使用,即定义一个test.h的头文件,在该头文件中添加声明,然后当有其他文件需要调用这些变量时,之间调用此头文件即可。

//test.c文件int i = 5;int b = 6;int b = 7;
//test.hextern int i = 5;extern int b = 6;extern int b = 7;
//main.c文件#include <stdio.h>#include "test.h"//extern int i;不再需要用此方式,改为调用test.h头文件即可int main(){printf("i=%d\n",i);    return 0;}

2、extern “C” 用法
在C++中,extern "C"修饰的语句是为了编译器按照c的方式去进行编译的,为什么需要这样呢,是因为,如果在cpp文件中调用了c函数,那么就需要对这些c函数进行extern "C"操作,从而在编译cpp程序时,调用这些函数的时候,这些函数要按照c编译。

第一种情况:
果main.cpp文件要调用c函数接口,只要在main.cpp里面包含c函数接口用用extern “C” 括起来即可
例如:

//main.cpp文件#include<iostream>using namespace std;extern “C” //用extern“C”{ }声明math.c文件中的函数,以至于可以在main.cpp文件使用。{int add (int x,int y);int sub(int x,int y);}int main(){cout<<add(10,20)<<endl; //由于有声明该函数,所以访问成功,结果30cout<<sub(10,20)<<endl;//由于有声明该函数,所以访问成功,结果-10return 0;}

第二种情况:
简单情况下,如果main.cpp文件要调用c函数接口,只要在main.cpp里面包含c函数接口的头文件math.h,并且用extern “C” 括起来即可,代表math.c的函数按照c编译
例如:

//math.hint add();int sub();
//math.cint add(){}int sub(){}
//main.cpp#include <iostream>using namespace std;extern "C"{#include "math.h"}

以上两种情况是比较简单的,但是如果现在有三个文件,分别是main.cpp,math.h,main1.c,如果math.h头文件中存在个别函数用extern "C"包含了,main.cpp包含math.h头文件不会有问题,但是main2.c文件包含math.h头文件的时候,会不识别extern "C"从而报错,这种情况,就需要宏 #define __cplusplus

// math.h文件的内容 //意思是如果使用该头文件math.h的文件定义了__cplusplus,//则下面代码到#endif都是有效的,在这里是 extern "C" { 有效#ifdef __cplusplus extern "C" {#endif  //__cplusplusint add (int x,int y);//加法int sub(int x,int y);//减法int mult(int x,int y);//乘法int div(int x,int y); //除法//意思是如果使用该头文件math.h的文件定义了__cplusplus,//则下面代码到#endif都是有效的,在这里是 } 有效#ifdef __cplusplus}#endif  //__cplusplus

第三种情况:(最优解)
创建的任何一个.cpp文件中,默认定义一个宏 #define __cplusplus,这个宏是你看不到的,是编译器默认给每个.cpp文件创建的,而在.c文件,即C语言的编译器,是没有这个宏的,所以我们可以借助它,来在 math.h文件中使用上面的代码。

在main.cpp文件你直接包含该头文件math.h就可以使用了;
在main2.c文件中你直接包含该头文件math.h就可以使用了;

只要按上面的方式书写,那么就可以完美的解决了在C文件和C++文件中混用的问题;你既可以在.c文件使用该头文件,也可以在.cpp文件中使用该文件库。

总结:
两者 extern 和 extern"C"有点区别:
extren 在C和C++中,都表示声明语句的意思;
而 extern"C"是按C语言方式去编译文件;
extern"C"只能在C++文件使用,extern在C和C++都可以使用


点击全文阅读


本文链接:http://zhangshiyu.com/post/162398.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1