c语言中声明的问题【求个关注!】

文章目录

  • 1 变量的声明与定义
    • (1)定义与声明的区别:
    • (2)为什么要区分定义与声明?
    • (3)extern是什么 ?
    • (4)举例:
  • 2 函数的声明:
      • 函数声明的格式:
      • 函数声明的本质:
      • 最后


1 变量的声明与定义

(1)定义与声明的区别:

变量定义是为变量分配内存空间,并赋予初始值
变量声明是向程序表明变量的类型与名字
定义也是声明,但声明不是定义
在程序中我们可以声明多次,但只能定义一次,这就好比,我们可以使用很多次锤子,但是锤子只有一把

(2)为什么要区分定义与声明?

程序员们编写程序时,不会将程序全部写在一个.c文件中(这样不能使程序员们同时进行编码,
且代码可读性很差),
而是存放在多个文件中去, 如果我们想引用其他文件定义的变量,函数,则需要用到声明,声明的作用即
告诉
编译器,有这个函数或变量,可以调用,而在链接阶段使程序去查找变量或函数的定义。

(3)extern是什么 ?

extern是C/C++中的一个关键字,用于声明一个全局变量或函数,表示该变量或函数是在其他文件中定义的。
它的作用是告诉编译器该变量或函数的定义在其他地方,而不是当前文件中。具体来说,extern可以用于以下两种情况:声明全局变量:当在一个文件中声明一个全局变量时,如果该变量是在其他文件中定义的,
就需要使用extern关键字进行声明。这样编译器在编译时就知道该变量是在其他文件中定义的,并且可以正确地链接到该变量的定义处。声明外部函数:当在一个文件中调用一个函数时,如果该函数是在其他文件中定义的,也需要使用extern关键字进行声明。这样编译器在编译时就知道该函数是在其他文件中定义的,并且可以正确地链接到该函数的定义处。总结一下,extern关键字用于声明全局变量或函数的定义在其他文件中。
它的作用是告诉编译器该变量或函数的定义在其他地方,以便正确地链接到定义处。

(4)举例:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include 包含文件的功能本质上即是声明,这与extern的功能相同,所以二者选其一即可,
在声明时,我发现在VS2022上,不用extern关键字也行,比如直接声明int b

2 函数的声明:

在c语言中,默认的情况是只能定义在后的函数调用定义在前的函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Add(int x, int y) {return x + y;
}
int main() {int a = 3, b = 5;int c = Add(a, b);printf("%d\n", c);return 0;
}

在这里插入图片描述

如果调用定义在后的函数:则在c标准编译器中会报错,(gcc编译器中只会报警告)
如果想调用定义在后的函数,则需要用对应的函数声明(被调用函数的)   

如果将main函数与Add函数的位置调换:

int main() {int a = 3, b = 5;int c = Add(a, b);printf("%d\n", c);return 0;
}
int Add(int x, int y) {return x + y;
}

函数声明的格式:

//int Add(int x, int y);
//声明的格式是:
//返回值类型  函数名(形参类型 形参名  ....);
//声明放在定义在前的函数之前:```c
#include<stdio.h>
int Add(int x, int y);
int main() {int a = 3, b = 5;int c = Add(a, b);printf("%d\n", c);return 0;
}
int Add(int x, int y) {return x + y;
}

函数声明的本质:

//声明的本质是什么?
//声明可以看作告诉编译器,所调用的函数存在,函数的基本信息是什么
(返回值类型,函数名等等),
// 而不会去探究函数体是什么,是否定义,在链接阶段,才会去查找
声明函数的函数体,如果函数并不存在:
,则会在链接阶段报错,而解决问题就是添加上对应的函数定义

例如:

#include<stdio.h>
int Add(int x, int y);int main() {int a = 3, b = 5;int c = Add(a, b);printf("%d\n", c);return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结果表明是链接阶段出现错误

最后

函数的声明并不仅仅用于定义在前的函数调用定义在后的函数
,也用于引用其他文件中函数,比如include 包含头文件本质上就是声明的一种:
例子:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
或者:

//#include"Add.h"
//上面与下面的语句本质相同,均是声明!
int Add(int x, int y);
#include<stdio.h>
int main() {int a = 3, b = 5;int c = Add(a, b);printf("%d\n", c);return 0;
}
# 2 

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

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

相关文章

Springboot整合nacos报错无法连接nacos

报错信息&#xff1a;Nacos com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING 关于这个报错的原因有很多&#xff1a;如Nacos未启动、网络问题、配置问题、版本不兼容问题等&#xff0c;我的报错原因主要是版本不兼容。 下面…

GPT演变:从GPT到ChatGPT

Transformer 论文 Attention Is All You Need The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder… https://arxiv.o…

STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档)

目录 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 2.2 设计电路规范 3、代码 4、资料清单 资料下载地址&#xff1a;STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档) 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 经过一个星期的画PCB&#xff0c;今…

C语言: 字符串函数(下)

片头 在上一篇中,我们介绍了字符串函数。在这一篇章中&#xff0c;我们将继续学习字符串函数&#xff0c;准备好了吗&#xff1f;开始咯&#xff01; 1.strncpy函数 1.1 strncpy函数的用法 strncpy是C语言中的一个字符串处理函数&#xff0c;它用于将一个字符串的一部分内容…

[lesson27]二阶构造模式

二阶构造模式 构造函数的回顾 关于构造函数 类的构造函数用于对象的初始化构造函数与类同名并且没有返回值构造函数在对象定义时自动被调用 你该知道的真相 构造函数 只提供自动初始化成员变量的机会不能保证初始化逻辑一定成功执行return语句后构造函数立即结束 构造函数…

学浪已购买视频怎么下载到本地?

许多学习者在学浪购买了丰富的课程&#xff0c;然而&#xff0c;一些课程存在时间限制&#xff0c;使得学习者希望将其下载并永久保存。在这里&#xff0c;我们将介绍一款名为小浪助手的工具&#xff0c;它能够帮助你轻松将学浪已购买的视频下载到本地&#xff0c;让学习变得更…

Python匿名函数4不要

当你需要完成一件小工作时&#xff0c;在本地环境中使用这个函数&#xff0c;可以让工作如此得心应手&#xff0c;它就是Lambda 函数。 Lambda 函数是 Python 中的匿名函数。有些人将它们简称为lambdas&#xff0c;它们的语法如下&#xff1a; lambda arguments: expressionl…

[通俗易懂:Linux标准输入/输出和重定向]Shell脚本之 > /dev/null 2>1命令详解

目录标题 一、> /dev/null 2>&1 命令解析二、/dev/null 文件浅显理解三、标准输入、标准输出、标准错误输出四、输入重定向、输出重定向五、命令作用与应用场景 如果想看命令意义&#xff0c;可以直接跳到第五部分 一、> /dev/null 2>&1 命令解析 我们在别…

了解大语言模型的参数高效微调(Parameter-Effcient Fine-Tuning)

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 大语言模型在众多应用领域实现了突破性的进步&#xff0c;显著提升了各种任务的完成度。然而&#xff0c;其庞大的规模也带来了高昂的计算成本。这些模型往往包含数十亿甚至上千亿参数&#xff0c;需要…

【spring】@Profile注解学习

Profile介绍 在Spring框架中&#xff0c;Profile注解用于根据特定的配置文件来有条件地激活或禁用Bean的定义。这在开发和测试过程中非常有用&#xff0c;因为它允许你为不同的环境&#xff08;如开发、测试、生产&#xff09;定义不同的配置。 Profile不仅可以标注在方法上&…

fastjson 序列化问题

问题: 使用fastjson 的 对同一个JSONObject对象 多次引用后, 通过 JSON.toJSONString() 方法进行json序列化时出现只有第一次的可以成功序列化未json string 字符串, 后面的对象都为引用地址; 示例: public static void main(String[] args) {JSONObject jsonObject new JSON…

【leetcode面试经典150题】28.盛最多水的容器(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…