C语言 extern关键字理解

一、问题

以下是C语言的程序:

sumaa.h:
extern int sumAA(int a, int b);sumaa.c:
#include <stdio.h>
#include "sumaa.h"
int sumAA(int a, int b)
{return a+b;
}two.h:
void sayBye();two.c:
#include "two.h"
void sayBye()
{printf("Bye Bye..");
}main.c:
#include <stdio.h>
#include "sumaa.h"
#include "two.h"int main(int, char**){printf("Hello, from aaa!\n");printf("Hello, %d \n", sumAA(11, 22));sayBye();
}输出结果:
Hello, from aaa!
Hello, 33
Bye Bye..

两个头文件中,一个加了extern关键字,一个没加。但从结果看,两个函数都正常调用了。
那么 extern 到底有什么作用呢?

二、extern作用

在C语言中,extern关键字用于声明一个函数或变量,表示该函数或变量在程序的其他地方已经定义。当你在一个源文件中使用extern声明一个函数或变量时,你告诉编译器这个函数或变量的定义存在于其他地方,而不是在当前的源文件中。

在上面的例子中,two.h中的sayBye函数声明没有使用extern关键字,但仍然可以正确调用。这是因为默认情况下,当在头文件中包含函数声明时,它实际上隐式地使用了extern。所以,即使你没有显式地写extern void sayBye();编译器也会将其视为外部链接,因为它知道这是一个函数声明而不是定义。

extern关键字的主要作用在于:

  1. 明确性:使用extern可以使代码更加明确和易于理解。它明确地告诉编译器和其他程序员,这个函数或变量的定义在其他地方。

  2. 模块化编程:在大型程序中,extern允许我们将函数和变量的定义放在单独的源文件中,从而实现模块化编程。这使得代码更易于维护、测试和重用。

  3. 控制链接:使用extern可以控制符号(函数和变量)的链接。当你在头文件中使用extern时,你实际上是在告诉编译器不要在当前源文件中创建该符号的定义。如果你忘记了extern,并且又在头文件中包含了函数或变量的定义,那么每个包含该头文件的源文件都会创建该符号的定义,导致链接错误(称为多重定义)

此例子中,虽然two.h中没有显式使用extern,但因为它是一个函数声明而不是定义,所以程序仍然可以正确编译和链接。然而,为了代码清晰性和遵循良好的编程习惯,许多程序员仍然会在函数声明前加上extern关键字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/687501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

突破编程_C++_面试(基本数据类型)

面试题1&#xff1a;在32位和64位系统上&#xff0c;int、short、long、long long 和 char 类型通常分别占用多少字节 在 32 位和 64 位系统上&#xff0c;int、short、long、long long 和 char 类型的大小可能会有所不同&#xff0c;这取决于编译器和操作系统。但按照常见的约…

线程学习小结

线程&#xff1a;一个程序内部的一条执行流程 多线程&#xff1a;软硬件实行的多条执行流程的技术&#xff08;多线程由cpu负责调度执行&#xff09; 多线程的本质就是多个程序同时执行&#xff0c;但是进程同一时间只能有一个&#xff0c;所以线程会被cpu调度并且分配时间片…

使用redis-insight连接到服务器上的redis数据库

一、安装redis&#xff1a; 安装 Redis。你可以通过运行下面的命令来使用 yum 安装 Redis&#xff1a; sudo yum install redis 启动 Redis 服务。安装完成后&#xff0c;你可以通过运行下面的命令来启动 Redis 服务&#xff1a; sudo systemctl start redis 设置 Redis 服务…

g++编译--运行opencv步骤。

一&#xff1a;下载opencv源码库。 1 cmake -D CMAKE_BUILD_TYPERelease -D OPENCV_GENERATE_PKGCONFIGON -D WITH_FFMPEGON … 2 make -j 8 3 make install 二&#xff1a; 找到两个目录&#xff1a; include/ 所有头文件 lib/ 所哟库文件 三&#xff1a;编译运行代码&#xf…

定时器(基本定时器、通用定时器、高级定时器)

目录 一、基本定时器 二、通用定时器 三、高级定时器 一、基本定时器 1、作用&#xff1a;计时和计数。 二、通用定时器 1、除了有基本定时器的计时和计数功能外&#xff0c;主要有输入捕获和输出比较的功能&#xff0c;硬件主要由六大部分组成&#xff1a; ① 时钟源 ② 控…

前端架构: 脚手架框架之yargs的11种基础核心特性的应用教程

脚手架框架之yargs的基础核心特性与应用 1 &#xff09;概述 yargs 是脚手架当中使用量非常大的一个框架进入它的npm官网: https://www.npmjs.com/package/yargs 目前版本: 17.7.2Weekly Downloads: 71,574,188 (动态数据)最近更新&#xff1a;last month (github)说明这是一个…

【Webpack】处理图片资源

处理图片资源 过去在 Webpack4 时&#xff0c;我们处理图片资源通过 file-loader 和 url-loader 进行处理 现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了&#xff0c;我们只需要简单配置即可处理图片资源 1. 配置 const path require("path");modul…

美国突然致敬中本聪

作者&#xff1a;秦晋 有点看不懂美国的神操作。 2月16日&#xff0c;据《Bitcoin Magazine》报道&#xff0c;比特币的竞争对手、美国参议员伊丽莎白-沃伦对比特币的立场突然180度大转弯。由反对立场转为支持立场。让很多行业媒体出乎意料&#xff0c;甚至惊掉下巴。 报道称&a…

Web Components详解-HTML Templates

前言 在前面Web Components系列文章的插槽中&#xff0c;我们使用直接在body中写入html标签的形式来承载shadowDOM中的元素&#xff0c;这么做会使标签在DOM多渲染一次&#xff0c;不仅降低了性能&#xff0c;还使标签直接暴露在页面中&#xff0c;遵循组件的可重用性、隔离性…

Unity3D 九宫格地图加载逻辑详解

前言 Unity3D是一款强大的游戏开发引擎&#xff0c;拥有丰富的功能和工具&#xff0c;可以帮助开发者快速构建出各种类型的游戏。在游戏开发中&#xff0c;地图加载是一个非常重要的环节&#xff0c;九宫格地图加载是一种常用的地图加载方式&#xff0c;可以有效地提高游戏性能…

文件上传漏洞--Upload-labs--Pass01--前端绕过

一、前端绕过原理 通俗解释&#xff0c;我们将写有恶意代码的php后缀文件上传到网页&#xff0c;网页中的javascript代码会先对文件的后缀名进行检测&#xff0c;若检测到上传文件的后缀名为非法&#xff0c;则会进行alert警告。若想上传php后缀的文件&#xff0c;就要想办法对…

人工智能学习专栏文章汇总

人工智能大潮已来&#xff0c;stay hungry, stay foolish! 人工智能技术学习类文章汇总&#xff1a; 人工智能学习与实训笔记&#xff08;一&#xff09;&#xff1a;零基础理解神经网络-CSDN博客 人工智能学习与实训笔记&#xff08;二&#xff09;&#xff1a;神经网络之图…

Html的<figure><figcaption>标签

Html的<figure><figcaption>标签 示例一: <figure><figcaption>figcaption001, fig标题1 </figcaption><figcaption>figcaption002, fig标题2 </figcaption><div style"width:calc(100px*2); height:calc(100px*2); back…

力扣经典题:环形链表的检测与返回

1.值得背的题 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode*fasthead;struct ListNode*slowhead;while(fast!NULL&&fast->…

解锁Spring Boot中的设计模式—03.委派模式:探索【委派模式】的奥秘与应用实践!

委派模式 文章目录 委派模式1.简述**应用场景****优缺点****业务场景示例** 2.类图3.具体实现3.1.自定义注解3.2.定义抽象委派接口3.3.定义具体执行者3.4.定义委派者(统一管理委派任务)3.5.定义委派者管理类 4.测试4.1.controller层4.2.测试不同场景4.2.1.测试生产部门计算费用…

html5移动端适配;检测浏览器信息函数

html5移动端适配 //动态改变font-size大小 (function changeFontSize() {let resizeEvt orientationchange in window ? orientationchange : resizeif (!isPC()) {let docEl document.documentElement;// recalc function () {let clientWidth docEl.clientWidth;docEl.…

【GPT-2】论文解读:Language Models are Unsupervised Multitask Learners

文章目录 介绍zero-shot learning 零样本学习 方法数据Input Representation 结果 论文&#xff1a;Language Models are Unsupervised Multitask Learners 作者&#xff1a;Alec Radford, Jeff Wu, Rewon Child, D. Luan, Dario Amodei, I. Sutskever 时间&#xff1a;2019 介…

java.lang.NumberFormatException: For input string: “!“

文章目录 MyBatis XML文件查询报错&#xff1a;For input string: "!"原因调整办法OGNL表达式 MyBatis XML文件查询报错&#xff1a;For input string: “!” <if test"memberInfoDrawing.phone ! null and memberInfoDrawing.phone ! and memberInfoDrawi…

Hadoop-Yarn-NodeManager都做了什么

一、源码下载 下面是hadoop官方源码下载地址&#xff0c;我下载的是hadoop-3.2.4&#xff0c;那就一起来看下吧 Index of /dist/hadoop/core 二、上下文 在我的<Hadoop-Yarn-启动篇>博客中已经简要的分析了NodeManager的启动过程&#xff0c;NodeManager是管理整个集…

MongoDB聚合运算符:$add

$add运算符将将数字相加或将数字和日期相加。如果参数之一是日期&#xff0c;则 $add会将其他参数视为毫秒&#xff0c;并添加到日期中。 语法 { $add: [ <expression1>, <expression2>, ... ] }参数可以是任何有效的表达式&#xff0c;只要能否解析为数值或日期…