C++中的头文件与Extern(外部函数调用)方式

 更新时间:2023年08月02日 09:49:15   作者:Kylee Brady  
这篇文章主要介绍了C++中的头文件与Extern(外部函数调用)方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

C++头文件与Extern(外部函数调用)

⒈ 头文件引用

⒉ extern调用同一个项目中的其他cpp文件中的函数

【 main.cpp 】 

#include"day0915_3.h"
extern void func_1();
void func_2(){
	cout << "Hello" << endl;
}
int main(){
//	void (*x)();
//	x = func_1;
//	x();
	int a = 99;
	int *p = &a;
	cout << *p**p <<endl;
	cout << func_h() << endl;
	system("pause");
	func_1();
	return 0;
}

【 day0915_3.h 】

#ifndef 条件编译,防止头文件被多次包含

#ifndef __DAY0915_3_H__
#define __DAY0915_3_H__
#include"iostream"
using namespace std;
int func_h();
#endif

▶【 day0915_3.cpp 】

#include <iostream>
using namespace std;
int func_h(){
	return 999;
}
void func_1(){
	cout << "hello,world!" << endl;
}

通过extern和头文件来引用函数,有啥区别 ?

1、extern 应用于全局变量,函数或模板声明

说明该符号具有外部链接 (external linkage) 属性(这个符号在别处定义)。

2、变量可以声明多次,但只能定义一次

在程序中变量可以声明多次,但只能定义一次。

一般而言,定义就是声明。

但 C++ 中由于 extern 的缘故,变量的声明和定义是可以分开的。

凡是没有带 extern 的声明同时也都是定义。

而对函数而言,带有{}是定义,否则是声明。

int i;                //声明并定义i
int j = 1;            //声明并定义j
double max(double d1,double d2){} //函数定义
extern double max(double d1,double d2);  //函数声明

如果想声明一个变量而非定义它,

就在变量名前添加关键字 extern,且不要显式的初始化变量。

extern int i;          //声明i而非定义
extern int j = 2;      //错误,定义j而非声明,会报错,多重定义
int j;                 //错误,重定义,注意这里的j是在全局范围内声明

3、变量的声明

当链接器在一个全局变量声明前看到 extern 关键字,

它会尝试在其他文件中寻找这个变量的定义;

可以在头文件中声明一个变量,

在用的时候包含这个头文件就相当于声明了这个变量。

4、使用 extern 和包含头文件来引用函数有什么区别呢?

与 include 相比,extern 的引用方式比包含头文件要更简洁:

extern 引用另一个文件的范围小,想引用哪个函数就用 extern 声明哪个函数;

而 include 可以引用另一个文件的全部内容。

这样做的一个明显的好处是,

会提高程序编译(预处理)效率,节省时间。

在大型 C++ 程序编译过程中,这种差异是非常明显的。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言 数据结构堆排序顺序存储(升序)

    C语言 数据结构堆排序顺序存储(升序)

    这篇文章主要介绍了C语言 数据结构堆排序顺序存储(升序)的相关资料,需要的朋友可以参考下
    2017-05-05
  • Opencv实现对象提取与测量

    Opencv实现对象提取与测量

    这篇文章主要为大家详细介绍了基于Opencv实现对象提取与测量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 一篇文章详解Qt中如何访问数据库

    一篇文章详解Qt中如何访问数据库

    Qt是一个广泛使用的跨平台应用程序框架,它提供了许多功能,包括数据库访问,这篇文章主要给大家介绍了关于Qt中如何访问数据库的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • QT QML的元素布局的实现

    QT QML的元素布局的实现

    这篇文章主要介绍了QT QML的元素布局的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C++之虚函数与多态的实现原理分析

    C++之虚函数与多态的实现原理分析

    文章讲解了C++多态原理,通过虚函数表(虚表)实现动态绑定,探讨了单继承、多继承及菱形继承中的虚表结构,并指出虚函数不能是内联或静态函数,因需函数地址存储于虚表
    2025-09-09
  • C++中平衡二叉搜索树的模拟实现

    C++中平衡二叉搜索树的模拟实现

    二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下,所以本文给大家介绍了C++平衡二叉的搜索树模拟实现方法,需要的朋友可以参考下
    2023-09-09
  • C++共享智能指针shared_ptr的实现

    C++共享智能指针shared_ptr的实现

    在C++中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露,解决这个问题最有效的方法是使用智能指针,本文主要介绍了C++共享智能指针shared_ptr的实现,感兴趣的可以了解一下
    2023-12-12
  • 简单实现C语言2048游戏

    简单实现C语言2048游戏

    这篇文章主要为大家详细介绍了简单实现C语言2048游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • QT与MATLAB混合编程的详细教程

    QT与MATLAB混合编程的详细教程

    最近项目需要,matlab的一些算法需要工程用,因此需要直接转成Qt能够调用的形式,下面这篇文章主要给大家介绍了关于QT与MATLAB混合编程的相关资料,需要的朋友可以参考下
    2023-01-01
  • C语言 操作符#与##使用方法详解

    C语言 操作符#与##使用方法详解

    在类函数宏中(带参数的宏),#号作为一个预处理运算符,可以把记号转换成字符串。##相当于连接符,它会将两边的内容连接起来,形成新的标识符,下面请看详细的教程
    2022-04-04

最新评论