C语言从头学24——函数原型
前面学习函数时已经知道必须先存在一个函数然后才能使用,且这个函数的位置还要在 main()函数之前,否则的话编译时会报错。但我们写程序时,main() 函数是程序入口,程序的主要部分都在 main() 函数中,且其它函数也都要通过 main函数引入到程序中。因此,我们希望main函数能够尽量靠前,不要被其他子函数挤到后边去,导致阅读代码不方便;如何处理呢?为此引入函数原型概念。
所谓函数原型就是仅包含函数的返回值类型、函数名称和参数类型等部分内容的函数头。
自此,我们把函数声明与实现分开,声明就是仅声明函数原型部分;实现是函数原型(参数要写全)加上函数体一并完成。这样,我们在 main() 函数前声明函数原型后,等于提前告诉编译器,有一个这样的函数要使用,其他信息暂时不提供,有待后补。如此,编译器就不再报错。这样就解决了main()函数位置可能过于靠后的问题。举例:
#include<stdio.h>
void myPrint(char* s); //声明myPrint函数原型(s可写可不写,写上阅读代码清楚一些)
int main(void)
{char str[1024] = "Hello World!"; myPrint(str); //调用myPrint函数//传入的参数是数组名//数组名就是指向数组起始位置的指针,等价于&str[0]getchar();return 0;
}
void myPrint(char* s) //完整实现myPrint函数,位置就不必在main函数之前了,注意这里参数是要写全的
{printf(s);return;
}
我们在写稍微长一些的程序时,即使把许多函数的实现放到main函数后边,也还是感到乱得很。怎么办呢?我们可以分文件编写。以使用VS编辑程序为例:我们右键头文件 -> 添加 -> 新建项,自己定义一个文件名(后缀也可以自己定义);接下来我们可以把若干个函数的声明及实现放到这个文件中。怎样使用这些文件呢?我们在main函数前面用#include把这个文件名包含进来就可以了。注意一点区别,系统提供的头文件名字是用尖括号括起来,我们自定义的不用尖括号,用引号引起来即可。类似这样的文件我们可以写上好几个,如此,程序的逻辑就容易看清楚了。
相关文章:
C语言从头学24——函数原型
前面学习函数时已经知道必须先存在一个函数然后才能使用,且这个函数的位置还要在 main()函数之前,否则的话编译时会报错。但我们写程序时,main() 函数是程序入口,程序的主要部分都在 main() 函数中,且其它函数也都要通…...
Vue中使用ElementUI组件Form组件的校验validate
先准备一些el-form元素 这里面el-form中:model(v-bind:model)是单项绑定的,如果你写成了v-model""可能会出现校验没有效果的情况。 这是校验过后的结果了 现在开始使用下吧! 1.在el-form中绑定一个ref,名字自拟,后续触发检验结果…...
PostgreSQL性能优化之分区表 #PG培训
在处理大规模数据时,PostgreSQL的性能优化是一个非常重要的话题,其中分区表(Partitioned Tables)是提高查询和数据管理效率的重要手段。本文将详细介绍PostgreSQL分区表的概念、优势、创建与管理方法以及一些常见的优化策略。 #P…...
SAPUI5基础知识9 - JSON Module与数据绑定
1. 背景 在前面的博客中,我们已经学习了SAPUI5中视图和控制器的使用,在本篇博客中,让我们学习下MVC架构中的M-模型了。 SAPUI5中的JSON Model是一个客户端模型,可以用于在SAPUI5应用程序中处理和操作JSON数据。SAPUI5提供了绑定…...
解决vue3使用ref 获取不到子组件属性问题
需求: 父子组件使用<script setup>语法糖,父组件通过给子组件定义ref访问子组件内部属性或事件。 关键点: 子组件中,setup语法糖需要用defineExpose把要读取的属性和方法单独暴露出去,否则会访问失败…...
使用STL容器还是Qt容器?
在C编程中,选择合适的容器库对于编写高效、可维护的代码至关重要。两大主流选择是STL容器(如std::map,std::vector等)和Qt容器(如QMap,QVector等)。本文将探讨两者的优缺点,以帮助开…...
Android 2ndBLE的实现
没有需求创造需求 有没有想过一件事情,假如你的手机关机了,而且在家里怎么都找不到的情况? 那么通过另外一种手机进行查找是不是可以?听上去有点搞笑,但实际上确实有这样的需求存在。实现方案是用超低功耗蓝牙&#…...
常见硬件工程师面试题(二)
大家好,我是山羊君Goat。 对于硬件工程师,学习的东西主要和电路硬件相关,所以在硬件工程师的面试中,对于经验是十分看重的,像PCB设计,电路设计原理,模拟电路,数字电路等等相关的知识…...
java构造方法的重载
在java中,与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,但是要求每个构造方法的参数类型或参数不同。在创建对象时,可以通过调用不同的构造方法为不同属性赋值。 示例代码如下 class Student5…...
webpack 压缩图片
压缩前: 压缩后: 压缩后基本上是压缩了70-80%左右 1.依赖版本及配置 "imagemin-webpack-plugin": "^2.4.2", "imagemin-mozjpeg": "^7.0.0", "imagemin-pngquant": "^5.0.1", "webpa…...
JAVA每日作业day6.24
ok了家人们今天学习了一些关键字,用法和注意事项,静态代码块这些知识,闲话少叙我们一起看看吧。 一,final关键字 1.1 final关键字的概述 final: 不可改变。可以用于修饰类、方法和变量。 类:被修饰的类&a…...
鸿蒙开发系统基础能力:【@ohos.hiTraceChain (分布式跟踪)】
分布式跟踪 本模块提供了端侧业务流程调用链跟踪的打点能力,包括业务流程跟踪的启动、结束、信息埋点等能力。 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import hi…...
.git目录解读
在执行 git init 命令时,Git 会在当前目录中创建一个名为 .git 的目录。该目录包含 Git 所需的所有元数据和对象,用于版本控制。以下是 .git 目录结构的示意图,并附有每个目录和文件的作用说明: .git #…...
如何在Java中处理InterruptedException异常?
如何在Java中处理InterruptedException异常? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java编程中,多线程是一个常见的应用场景…...
深入解读Netty中的NIO:原理、架构与实现详解
深入解读Netty中的NIO:原理、架构与实现详解 Netty是一个基于Java的异步事件驱动网络应用框架,广泛用于构建高性能、高可扩展性的网络服务器和客户端(学习netty请参考:深入浅出Netty:高性能网络应用框架的原理与实践&…...
Vim和Nano简介
**Vim**: - Vim 是一个文本编辑器,它是 Vi 编辑器的一个改进版本,Vi 编辑器最初由 Bill Joy 在1976年为 BSD Unix 开发。 - Vim 由 Bram Moolenaar 开发,其第一个版本在1991年发布。Vim 的设计理念是“持继改进”,它的…...
mysql的information_schema浅析
information_schema 是 MySQL 中的一个虚拟数据库,它包含了关于 MySQL 服务器的所有元数据。 information_schema 作用 元数据管理:提供关于数据库、表、列、索引、权限等的信息。 性能优化:帮助了解数据库结构和索引使用情况,便…...
力扣爆刷第153天之TOP100五连刷26-30(接雨水、环形链表、最长上升子序列)
力扣爆刷第153天之TOP100五连刷26-30(接雨水、环形链表、最长上升子序列) 文章目录 力扣爆刷第153天之TOP100五连刷26-30(接雨水、环形链表、最长上升子序列)一、300. 最长递增子序列二、415. 字符串相加三、143. 重排链表四、42.…...
【Linux】—Apache Hive 安装部署
文章目录 前言认识Metadata认识Metastoremetastore三种配置方式 一、安装前准备二、下载hive-3.1.2安装包三、下载完成后,通过xftp6上传到Linux服务器上四、解压Hive安装包五、配置Hive六、内嵌模型安装—Hive元数据配置到Derby七、本地模式安装—Hive元数据配置到M…...
组装盒示范程序
代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDO…...
如何用OB_Template构建你的终极读书笔记系统:Obsidian新手完全指南
如何用OB_Template构建你的终极读书笔记系统:Obsidian新手完全指南 【免费下载链接】OB_Template OB_Templates is a Obsidian reference for note templates focused on new users of the application using only core plugins. 项目地址: https://gitcode.com/g…...
从理论到代码:手把手实现Newmark-Beta方法的结构动力学模拟
从理论到代码:手把手实现Newmark-Beta方法的结构动力学模拟 结构动力学模拟是现代工程设计与分析中不可或缺的工具,从桥梁抗震到航天器振动分析,都需要精确预测结构在动态载荷下的响应。而Newmark-Beta方法作为这一领域的经典算法,…...
AI辅助学术写作:Qwen3-0.6B-FP8搭配LaTeX生成论文章节与参考文献
AI辅助学术写作:Qwen3-0.6B-FP8搭配LaTeX生成论文章节与参考文献 写论文,尤其是写引言和参考文献,是不是让你特别头疼?对着空白的文档发呆,不知道从何下笔;或者为了找一篇关键的参考文献,在数据…...
别再只防SSH了!给OpenWRT的Web管理后台LuCI也加上fail2ban防护(附日志配置避坑指南)
OpenWRT安全加固:为LuCI管理界面部署fail2ban防护的完整方案 路由器作为家庭网络的入口,其安全性往往被严重低估。大多数用户会记得给SSH服务配置fail2ban防护,却忽略了同样暴露在公网的Web管理界面——LuCI。这种安全防护的"偏科"…...
从零开始:使用Deepspeed ZeRO3优化Qwen3-8B微调,解决多卡显存不足问题
从零开始:使用Deepspeed ZeRO3优化Qwen3-8B微调,解决多卡显存不足问题 当你面对一个8B参数规模的大语言模型时,单卡训练往往显得力不从心。显存不足的报错就像一堵高墙,阻挡着许多开发者的探索之路。而多卡并行训练又带来了新的挑…...
ATOM-PRINTER嵌入式热敏打印固件深度解析
1. ATOM-PRINTER 嵌入式打印库深度解析与工程实践指南ATOM-PRINTER 是 M5Stack 推出的面向 ESP32 平台的轻量级嵌入式热敏打印固件库,专为 M5Stack Atom 系列微型主控模块(搭载 ESP32-WROVER-B)设计。该库并非传统意义上的“驱动层”C/C 库&a…...
C语言起源发展全知道,带你了解编程界元老的辉煌历程
C言语是一种具有通用性的编程言语,在软件开发范畴被广泛运用,如操作系统、嵌入式系统、高性能服务器还有各类应用软件,它因强大功能、简洁语法以及高效性能而闻名,本文会详细介绍C言语的起源、发展进程以及其在当今编程世界里的地…...
掌握Calibre电子书管理:从格式转换到高级编辑的完整指南
掌握Calibre电子书管理:从格式转换到高级编辑的完整指南 【免费下载链接】calibre The official source code repository for the calibre ebook manager 项目地址: https://gitcode.com/GitHub_Trending/ca/calibre Calibre是一款功能强大的开源电子书管理器…...
如何快速完成亚马逊SP-API注册:AWS IAM策略与角色配置详解
亚马逊SP-API高效注册指南:从AWS IAM配置到应用上线的全流程解析 当你的电商业务需要与亚马逊平台深度集成时,SP-API(Selling Partner API)将成为不可或缺的工具。作为亚马逊新一代的开发者接口,它比传统的MWS提供了更…...
少样本学习实战指南:从数据增强到多模态融合的5个关键技巧
少样本学习实战指南:从数据增强到多模态融合的5个关键技巧 在工业质检和医疗影像等实际场景中,数据稀缺问题长期困扰着机器学习工程师。传统深度学习模型需要海量标注数据,而现实情况往往是每个类别仅有几个样本可用。这种少样本学习…...
