当前位置: 首页 > news >正文

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

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和https大全套
  • Socket编程之TCP套件字
  • 【HTML-15.2】HTML表单按钮全面指南:从基础到高级实践
  • 【Hot 100】55. 跳跃游戏
  • 如何获得Python的requirement.txt
  • C#数字金额转中文大写金额:代码解析
  • 流媒体基础解析:从压缩到传输的基本了解
  • springMVC-9数据格式化
  • JavaScript 模板字面量标签函数:解锁字符串处理的终极武器
  • Kafka数据怎么保障不丢失
  • Git入门到精通:30分钟掌握核心技巧
  • 《Spring Cloud Gateway 快速入门:从路由到自定义 Filter 的完整教程》​
  • Excel快捷键
  • STM32 串口通信①:USART 全面理解 + 代码详解
  • 2025年- H62-Lc170--34.在排序数组中查找元素的第一个和最后一个位置(2次二分查找,标记向左寻找,标记向右寻找)--Java版
  • Visual Stuido笔记:C++二进制兼容性之间的兼容性
  • 六.MySQL增删查改
  • Day41
  • 2025年- H63-Lc171--33.搜索旋转排序数组(2次二分查找,需二刷)--Java版
  • 112 Gbps 及以上串行链路的有效链路均衡
  • 17网站一起做网店优势与劣势/小程序制作费用一览表
  • vps做网站/怎么自己建网站
  • javascriptjava阿姨/网站推广优化设计方案
  • 做的比较好的网页设计网站/如何创建一个app
  • 外贸独立站是什么意思/东莞seo建站优化工具
  • 怎样才能做好网站优化/武汉好的seo优化网