27 C 语言编程核心:main 主函数(基本形式、返回值、参数、命令行传参)、多文件编程实践

article/2025/6/18 23:09:55

1 main 主函数

1.1 主函数的作用

        在 C 语言中,main 主函数是程序的入口函数,所有 C 程序必须包含一个名为 main 的函数。程序总是从该函数开始执行,没有它程序就无法启动

  • 主函数可以调用其他函数。
  • 其他函数不能调用主函数。
  • 主函数不能调用自己(会导致无限递归)。

1.2 主函数的基本形式

        C 语言标准规定主函数有两种合法形式:

int main(void) { /* 函数体 */ }  // 显式声明无参数int main(int argc, char *argv[]) { /* 函数体 */ }  // 带参数形式

关于 void 的详细说明:

        在 C 语言中,void 在 main 函数的参数列表中可以省略,但它的含义会有所不同:

  1. int main(void)
    • 显式声明函数不接受任何参数
    • 这是现代 C 标准(如 C99/C11)推荐的方式。
    • 明确表示 main 函数无参数,更清晰、更符合现代标准,避免歧义。
  2. int main()
    • 传统 C 风格,表示函数参数未指定(即可能接受任意参数,具体由编译器实现定义),语法上是合法的,在旧代码中常见
    • 在历史上下文中,这种写法可能允许通过命令行参数传递(尽管标准方式是通过 argc 和 argv)。
  3. 建议:现代代码中建议使用 void 以明确意图。

1.3 主函数的返回值

返回值的意义

        main 函数返回一个整数值给操作系统(或调用环境)

  • 返回 0 表示程序成功执行结束
  • 返回非零值表示程序遇到错误或异常情况
  • 这个返回值可被操作系统或父进程用来判断程序执行状态。

默认返回值

  • 如果 main 函数没有显式返回,编译器会隐式添加 return 0;
  • 出于代码清晰性和可维护性考虑,建议显式包含 return 0; 或适当的错误码。

返回值类型

  • main 函数的返回类型必须是 int
  • 这是 C 标准(C99、C11、C17 等)的明确规定。

1.4 主函数的参数

参数形式

        主函数可以声明为接收两个参数:

int main(int argc, char *argv[])
  • argc(argument count):命令行参数的数量,至少为 1(程序本身的名称)
  • char *argv[]:可以看作是一个字符串数组,其中每个元素都是一个指向字符串的指针
  • argv(argument value):指向字符串数组的指针,存储所有参数
    • argv[0]:程序名称。
    • argv[1] 到 argv[argc-1]:用户输入的参数。
    • argv[argc]:固定为 NULL 指针。

参数处理示例

#include <stdio.h>int main(int argc, char *argv[]) // 参数个数,参数列表
{printf("Parameter count argc = %d\n", argc); // 如果没有参数,将会输出:1,即程序名本身// 遍历参数列表for (int i = 0; i < argc; i++){printf("Parameter %d: %s\n", i + 1, argv[i]);}return 0;
}

无参数时:

        当程序启动时,如果没有通过命令行传递额外参数,argc 的值将为 1,表示只有一个参数,即程序自身的名称 argv[0]

        程序在 VS Code 中的运行结果如下所示:

在 PowerShell 传递参数:

  1. 基本参数传递:

    • 参数默认通过空格分隔
    • 示例:./program.exe arg1 arg2 arg3
  2. 包含空格的参数:

    • 如果参数包含空格,需要用引号括起来
    • 示例:./program.exe "first argument" "second argument"

        下面我们用 VS Code 内嵌的 PowerShell 终端来做个演示。先使用编译指令把代码编译成可执行文件,接着在 PowerShell 环境里运行这个可执行文件,运行的时候在后面跟上对应的参数就行。

在 CMD 中传递参数:

        在 CMD 中处理主函数参数的方法与在 PowerShell 中一致。接下来,我们使用 VS Code 内嵌的 CMD 终端进行演示。同样,先使用编译指令将代码编译为可执行文件;然后,在 CMD 环境中运行该可执行文件,并在运行命令后添加相应的参数。

提示:

        在 Windows 系统中,argv[0] 通常会显示程序的完整绝对路径。这是因为 Windows 的命令行环境默认会传递完整的可执行文件路径作为第一个参数。  

传参的意义

        主函数设计 argc(参数计数)和 argv(参数值数组)参数的意义在于:

  1. 接收外部输入:让程序在运行时能够接收来自命令行的参数,从而实现动态的输入处理,而不是在编译时就固定输入。
  2. 增强程序灵活性:通过命令行参数,程序可以根据不同的输入执行不同的操作,而无需修改代码或重新编译,提高了程序的适应性和可扩展性。
  3. 便于集成与自动化:命令行参数使得程序可以轻松地集成到脚本和自动化流程中,方便进行批量处理或自动化任务。
  4. 提供用户交互:用户可以通过命令行参数直接与程序交互,指定所需的选项、输入文件或配置,提升了用户体验。

        假设你开发了一个简单的文件搜索工具,用户可以通过命令行参数指定要搜索的目录和文件名模式:

./search_tool /home/user/documents "*.txt"

        在这个例子中,argv[1] 是 /home/user/documents,argv[2] 是 *.txt。程序根据这些参数在指定目录中搜索所有 .txt 文件。通过这种方式,程序可以根据用户的需求灵活地执行任务,而不需要在代码中硬编码这些参数。


2 多文件编程

        多文件编程可以将不同功能的代码分散到不同的源文件中,使项目结构更清晰,便于维护和扩展

2.1 搭建项目结构

        首先创建一个名为 Multi-file_Program 的文件夹,然后在该文件夹中创建以下五个源文件:

  1. main.c:包含 main 函数和所有函数的原型声明
  2. add.c:只包含加法函数的实现
  3. sub.c:只包含减法函数的实现
  4. mul.c:只包含乘法函数的实现
  5. div.c:只包含除法函数的实现(注意处理除数为 0 的情况)

2.2 编写源代码

main.c:

#include <stdio.h>// 函数原型声明
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int div(int a, int b);int main()
{// 调用函数printf("5 + 3 = %d\n", add(5, 3));printf("5 - 3 = %d\n", sub(5, 3));printf("5 * 3 = %d\n", mul(5, 3));printf("5 / 3 = %d\n", div(5, 3));return 0;
}

add.c:

// add.c
// 只包含加法函数的实现/*** @brief 加法函数** @param a 第一个整型参数* @param b 第二个整型参数* @return 返回 int 类型*/
int add(int a, int b)
{return a + b;
}

sub.c:

// sub.c
// 只包含减法函数的实现/*** @brief 减法函数** @param a 第一个整型参数* @param b 第二个整型参数* @return 返回 int 类型*/
int sub(int a, int b)
{return a - b;
}

mul.c:

// mul.c
// 只包含乘法函数的实现/*** @brief 乘法函数** @param a 第一个整型参数* @param b 第二个整型参数* @return 返回 int 类型*/
int mul(int a, int b)
{return a * b;
}

div.c:

// div.c
// 只包含除法函数的实现,注意处理除数为 0 的情况/*** @brief 除法函数** @param a 第一个整型参数* @param b 第二个整型参数* @return 返回 int 类型*/
int div(int a, int b)
{if (b == 0){// 这里只是简单地返回 0,实际中可能需要更复杂的错误处理// 这通常不是一个好的做法,因为它隐藏了错误return 0; // 退出函数,返回 0}return a / b;
}

2.3 同时编译多个源文件

        在多文件编程中,将多个源文件同时编译成一个可执行程序是一个常见的需求。这可以通过修改 VS Code 的 tasks.json 配置文件或直接在终端中使用 gcc 命令来实现。

修改配置文件的方式

        在 VS Code 中,tasks.json 文件用于配置任务(如编译、运行等)。如果项目工作区中没有 tasks.json 文件,可以通过运行一个 C 源程序(如 main.c)让 VS Code 自动生成该文件

        打开生成的 tasks.json 文件,修改其内容以支持同时编译多个 C 源文件,如下所示:

        通过上述配置,无论你选择运行五个源文件(如 main.c、add.c、sub.c、mul.c、div.c)中的哪一个,VS Code 都会自动调用预定义的构建任务,使用 gcc 编译所有指定的源文件,并生成统一的 math_program.exe 可执行文件。

        程序在 VS Code 中的运行结果如下所示:

使用 gcc 命令的方式

        与通过 VS Code 的 tasks.json 配置文件编译多文件 C 项目不同,你可以直接在终端中使用 gcc 命令手动编译所有源文件。这种方式更加灵活,适合熟悉命令行操作的用户。


http://www.hkcw.cn/article/FYDgttkEHx.shtml

相关文章

GIS常见数据及主要应用综述:类型解析、应用案例与未来趋势全景解读

&#x1f30f; GIS常见数据及主要应用综述&#xff1a;类型解析、应用案例与未来趋势全景解读 地理信息系统&#xff08;GIS&#xff09;是支撑空间决策、资源管理、城市治理的重要技术体系。本文从常见数据类型入手&#xff0c;结合中国及国际资源&#xff0c;梳理典型GIS应用…

系统性学习C语言-第十二讲-深入理解指针(2)

系统性学习C语言-第十二讲-深入理解指针&#xff08;2&#xff09; 1. const 修饰指针1.1 const 修饰变量1.2 const 修饰指针变量 2. 野指针2.1 野指针成因2.2 如何规避野指针2.2.1 指针初始化2.2.2 小心指针越界2.2.3 指针变量不再使用时&#xff0c;及时置 NULL &…

Linux安装redis

Linux redis路径 https://download.redis.io/releases/解压安装Redis 解压 tar -zvxf redis-6.0.5.tar.gz 由于redis是c语言编写的&#xff0c;所以我们需要先安装gcc&#xff0c;安装的命令如下&#xff1a; yum install gcc-c安装 输入命令&#xff1a; make PREFIX/usr/…

NumPy 数组计算:广播机制

文章目录 NumPy 数组计算&#xff1a;广播机制一、广播机制简介二、广播机制的规则1. 广播机制示例 12. 广播机制示例 23. 广播机制示例 3 三、广播机制实战1. 数组的中心化2. 绘制二维函数 NumPy 数组计算&#xff1a;广播机制 我们在NumPy数组的计算&#xff1a;通用函数中看…

Codesys FOR 循环之轴控

关于多伺服的轴控,不管怎么写都会很复杂,要么编程的时候代码行数多,要么是后期检查时非常麻烦,目前还未找到一个两全其美的方法,今天介绍的是通过FOR循环的轴控,就属于后者,代码行数较少,控制的轴数也没有限制,不需要一个轴一个的复制FB块,但是想在调试的时候实时查看…

欧冠决赛杜埃梅开二度 新星闪耀赛场

北京时间6月1日,本赛季的欧冠决赛中,19岁的杜埃表现出色,梅开二度并送出一次助攻,帮助巴黎圣日耳曼在比赛进行到73分钟时以4-0领先国际米兰。据统计,杜埃成为自1964年国际米兰名宿桑德罗-马佐拉以来,首位在欧冠决赛中完成梅开二度并且送出助攻的球员。本赛季,杜埃代表巴…

使用VSCode在WSL和Docker中开发

通过WSL&#xff0c;开发人员可以安装 Linux 发行版&#xff08;例如 Ubuntu、OpenSUSE、Kali、Debian、Arch Linux 等&#xff09;&#xff0c;并直接在 Windows 上使用 Linux 应用程序、实用程序和 Bash 命令行工具&#xff0c;不用进行任何修改&#xff0c;也无需使用传统虚…

《汇编语言》第12章 内中断——实验12 编写0号中断的处理程序

编写0号中断的处理程序&#xff0c;使得在除法溢出发生时&#xff0c;在屏幕中间显示字符串"divide error&#xff01;"&#xff0c;然后返回到DOS。 要求&#xff1a;仔细跟踪调试&#xff0c;在理解整个过程之前&#xff0c;不要进行后面课程的学习。 ;sy12.asm …

黑马k8s(十八)

一&#xff1a;安全认证 1.安全认证-概述 2.安全认证-认证方式 认证管理 3.安全认证-授权管理 因为没有授予角色deployment的权限&#xff0c;所以不能查看 4.安全认证-准入控制 二&#xff1a;DashBoard 之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的…

python:PyMOL 使用教程 及实用示例

安装参阅&#xff1a;开源版PyMol安装保姆级教程 百度网盘下载 提取码&#xff1a;csub 简介: PyMOL是一个Python增强的分子图形工具。它擅长蛋白质、小分子、密度、表面和轨迹的3D可视化。它还包括分子编辑、射线追踪和动画。 PyMol的名字来源于“Py”表示该软件基于Python这…

第十二节:第三部分:集合框架:List系列集合:特点、方法、遍历方式、ArrayList集合的底层原理

List系列集合特点 List集合的特有方法 List集合支持的遍历方式 ArrayList集合的底层原理 ArrayList集合适合的应用场景 代码&#xff1a;List系列集合遍历方式 package com.itheima.day19_Collection_List;import java.util.ArrayList; import java.util.Iterator; import jav…

ZC-OFDM雷达通信一体化减小PAPR——SC-FDMA技术

文章目录 前言一、SC-FDMA 技术1、简介2、原理 二、MATLAB 仿真1、核心代码2、仿真结果 三、资源自取 前言 在 OFDM 雷达通信一体化系统中&#xff0c;信号的传输由多个子载波协同完成&#xff0c;多个载波信号相互叠加形成最终的发射信号。此叠加过程可能导致信号峰值显著高于…

【算法】贪心算法

一、贪心算法基本思想 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从 整体最优考虑&#xff0c;它所作出的选择只是在某种意义上的局部最优选择。 我们希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不 能对所有问题都得到整体最优解&#xff08;O…

通义灵码深度实战测评:从零构建智能家居控制中枢,体验AI编程新范式

一、项目背景&#xff1a;零基础挑战全栈智能家居系统 目标&#xff1a;开发具备设备控制、环境感知、用户习惯学习的智能家居控制中枢&#xff08;PythonFlaskMQTTReact&#xff09; 挑战点&#xff1a; 需集成硬件通信(MQTT)、Web服务(Flask)、前端交互(React) 调用天气AP…

C 语言开发中常见的开发环境

目录 1.Dev-C 2.Visual Studio Code 3.虚拟机 Linux 环境 4.嵌入式 MCU 专用开发环境 1.Dev-C 使用集成的 C/C 开发环境&#xff08;注&#xff1a;较老旧方案&#xff0c;适合基础学习&#xff09; 2.Visual Studio Code 结合 C/C 扩展 GCC/MinGW 编译器&#xff0c;配置…

关于用Cloudflare的Zero Trust实现绕过备案访问国内站点说明

cloudflare 是一个可免费的CDN&#xff0c;CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;加速国内网站&#xff0c;通常是已备案的。Zero Trust类似FRP&#xff0c;可以将请求转发到目标服务器。在使用Zero Trust绕过备案访问国内网站需要&…

火语言UI组件--播放器

【组件功能】&#xff1a;引用网络播放地址的视频播放器。 样式预览 设置 基础设置 属性名称属性释义输入值类型网络资源地址(url)播放视频的网络地址字符串类型音量(volume)播放视频的音量&#xff08;参考值&#xff1a;0 ~ 1)浮点型(Float)自动播放(autoplay)视频是否自动…

Linux基本指令

文章目录 1.ls指令1.1 ls -l指令1.2 ls-a指令1.2.1文件的类型1.2.2隐藏文件1.2.3[.]\[..]的含义 1.3 ls -d指令1.4 ls-F指令1.5ls指令子功能大全 2.pwd指令2.1路径分割符2.2/根目录 3.mkdir指令3.1 mkdir-p3.2mkdir常用功能 4.cd指令4.1多叉树概念4.2绝对/相对路径4.2.1绝对路径…

桥 接 模 式

在玩游戏的时候我们常常会遇到这样的机制&#xff1a;我们可以随意选择不同的角色&#xff0c;搭配不同的武器。这时只有一个抽象上下文的策略模式就不那么适用了&#xff0c;因为一旦我们使用继承的方式&#xff0c;武器和角色总有一方会变得难以扩展。这时&#xff0c;我们就…

leetcode3128. 直角三角形-medium

1 题目&#xff1a;直角三角形 官方标定难度&#xff1a;中 给你一个二维 boolean 矩阵 grid 。 如果 grid 的 3 个元素的集合中&#xff0c;一个元素与另一个元素在 同一行&#xff0c;并且与第三个元素在 同一列&#xff0c;则该集合是一个 直角三角形。3 个元素 不必 彼此…