今天看了下extern的用法,于是自己总结一波。
extern 是计算机语言中的关键字,可至于变量或函数前,以表示变量或函数的定义在别的函数中。提示编译器遇到此变量或函数时,在其他模块中寻找其定义,另外extern也可用来进行链接指定。
1.变量定义在别的函数中,当编译器遇到extern 变量时,以后出现此变量就会在别的模块寻找定义
此处声明和定义我是分开的,可以直接在声明后初始化,同样属于声明,如果还有test.cpp的定义就会编译出错,重复定义。
运行结果:
2.函数
3.extern C:保持这部分代码,以C语言的风格编译。c++在编译时,为了解决函数的多态问题,会将函数名和函数联合起来生成一个中间的函数名称,而C语言不会,使用extern “C”进行链接指定,告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。
//test.h
#ifndef _TEST_H_
#define _TEST_H_
#ifdef __cplusplus
extern "C"{
#endif
extern int a; //声明一个全局变量a
extern int b; //声明一个全局变量b
int add(int s,int t);
#ifdef __cplusplus
} ;
#endif
#endif
//test.c
#include"test.h"
#include <stdio.h>
int a=10; //定义
int b=20; //定义
int add(int s,int t){
#ifndef _cplusplus
printf("这是一个c程序!!!\n");
#endif
#ifdef __cplusplus
printf("这是一个c++程序!!!!!\n");
#endif
return s+t;
}
//main.cpp
#include <iostream>
#include "test.h"
using namespace std;
int main(int argc, char** argv) {
#ifdef __cplusplus
cout<<"这是一个c++程序"<<endl;
#endif
#ifndef _cplusplus
cout<<"这是一个c程序"<<endl;
#endif
cout<<"a="<<a<<",b="<<b<<endl;
int c=add(1,2);
printf("c=%d",c);
return 0;
}
运行结果:
注:编译器不同结果会不同
关于ifdef,ifndef请看这篇文章:https://www.cnblogs.com/Joyin/archive/2009/11/26/2262130.html
关于__cplusplus, _cplusplus分别是c++和c所独有的,有兴趣的可自行百度了解
参考文章:
http://blog.youkuaiyun.com/lishuhuakai/article/details/45944735
https://baike.baidu.com/item/extern/4443005?fr=aladdin