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

C语言核心知识点整理:结构体对齐、预处理、文件操作与Makefile

目录

  1. 结构体的字节对齐
  2. 预处理指令详解
  3. 文件操作基础
  4. Makefile自动化构建
  5. 总结

1. 结构体的字节对齐

字节对齐原理

  • 内存对齐:CPU访问内存时,对齐的地址能提高效率。操作系统要求变量按类型大小对齐。
  • 对齐规则:
    1. 每个成员的起始地址必须是min(成员类型大小, #pragma pack(n))的整数倍。
    2. 结构体总大小必须是最大成员对齐值的整数倍。
    3. 嵌套结构体需遵循相同规则。

示例分析

示例1
struct Test {int a;    // 4字节char b;   // 1字节
};
// 默认对齐(假设为4字节):
// 总大小 = 4(int) + 3字节填充 + 1(char) = 8字节

示例2(嵌套结构体)
struct A {double a;  // 8字节short b;   // 2字节
};struct Test {char a[20]; // 20字节int c;      // 4字节struct A d; // 12字节(8+4填充)char b;     // 1字节
};
// 总大小:20 + 4 + 12 + 1 + 3填充 = 40字节

调整对齐方式

  • #pragma pack(n):手动设置对齐粒度。
    #pragma pack(1) // 紧凑存储
    struct Test {char a; // 1字节int b;  // 4字节(无填充)
    };
    #pragma pack() // 恢复默认
    


2. 预处理指令详解

预处理阶段

  • 作用:宏定义、头文件包含、条件编译等。
  • 流程:预处理 → 编译 → 汇编 → 链接。

头文件包含

  • 区别:
    • #include <stdio.h>:系统头文件。
    • #include "test.h":当前目录或自定义路径。

头文件重复包含防护

#ifndef _TEST_H_
#define _TEST_H_
// 头文件内容
#endif

宏定义与条件编译

无参宏
#define PI 3.14
#undef PI // 取消定义

有参宏
#define MUL(x,y) ((x)*(y)) // 避免运算优先级问题
#define ADD(x,y) (x + y)

条件编译
#ifdef DEBUGprintf("Debug mode\n");
#elseprintf("Release mode\n");
#endif


3. 文件操作基础

文件操作模式

模式描述示例模式
r只读文本文件fopen("file.txt", "r")
w只写文本文件(覆盖)fopen("file.txt", "w")
a追加文本文件fopen("file.txt", "a")
rb只读二进制文件fopen("file.dat", "rb")
wb只写二进制文件(覆盖)fopen("file.dat", "wb")

字符与字符串读写

fgetc/fputc
FILE *fp = fopen("file.txt", "w");
fputc('A', fp); // 写入字符'A'
fclose(fp);

feof判断文件结束
char ch;
FILE *fp = fopen("file.txt", "r");
while ((ch = fgetc(fp)) != EOF) { // EOF表示文件结束printf("%c", ch);
}
fclose(fp);

fgets/fputs按行读写
// 写入
fputs("Hello World\n", fp);
// 读取
char buf[256];
fgets(buf, sizeof(buf), fp); // 读取一行,自动添加'\0'

格式化读写(fprintf/fscanf)

// 写入
fprintf(fp, "a=%d,b=%.2f\n", 100, 3.14);
// 读取
int a;
float b;
fscanf(fp, "a=%d,b=%f", &a, &b);

二进制文件操作(fread/fwrite)

typedef struct {char name[20];int id;
} STU;STU students[3] = { /* 初始化数据 */ };
// 写入
FILE *fp = fopen("data.dat", "wb");
fwrite(students, sizeof(STU), 3, fp);
fclose(fp);// 读取
STU read_data[3];
fp = fopen("data.dat", "rb");
fread(read_data, sizeof(STU), 3, fp);
fclose(fp);

文件随机读写

  • 定位文件指针:

    fseek(fp, 50, SEEK_SET); // 从文件头移动50字节
    fseek(fp, -50, SEEK_END); // 从文件尾回退50字节
    

  • 获取当前位置:

    long pos = ftell(fp); // 当前位置偏移量
    rewind(fp); // 快速回到文件开头
    


4. Makefile自动化构建

Makefile基础规则

# 目标依赖规则
main: main.o add.o sub.ogcc main.o add.o sub.o -o mainmain.o: main.cgcc -c main.c

变量与自动变量

  • 普通变量:
    CC = gcc
    CFLAGS = -Wall -g
    

  • 自动变量:
    • $@:目标文件名
    • $^:所有依赖文件
    • $<:第一个依赖文件

模式规则与函数

# 通用编译规则
%.o: %.c$(CC) -c $< -o $@ $(CFLAGS)# 查找所有.c文件
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRCS))

多文件项目示例

DIR_SRC = ./src
DIR_OBJ = ./obj
SRCS = $(wildcard $(DIR_SRC)/*.c)
OBJS = $(patsubst $(DIR_SRC)/%.c, $(DIR_OBJ)/%.o, $(SRCS))main: $(OBJS)$(CC) $^ -o main$(DIR_OBJ)/%.o: $(DIR_SRC)/%.c$(CC) -c $< -o $@ -I./include.PHONY: clean
clean:rm -rf $(DIR_OBJ)/*.o main


5. 总结

  • 结构体对齐:通过#pragma pack优化内存布局,避免内存浪费。
  • 预处理:宏定义提升代码复用性,条件编译增强跨平台兼容性。
  • 文件操作:区分文本与二进制模式,灵活使用fseekftell实现随机读写。
  • Makefile:自动化构建简化编译流程,支持多文件项目管理。

希望这篇博客能帮助你系统掌握C语言核心知识点!如果有疑问或需要进一步解释,欢迎在评论区交流!


相关文章:

C语言核心知识点整理:结构体对齐、预处理、文件操作与Makefile

目录 结构体的字节对齐预处理指令详解文件操作基础Makefile自动化构建总结 1. 结构体的字节对齐 字节对齐原理 内存对齐&#xff1a;CPU访问内存时&#xff0c;对齐的地址能提高效率。操作系统要求变量按类型大小对齐。对齐规则&#xff1a; 每个成员的起始地址必须是min(成…...

深度学习|注意力机制

一、注意力提示 随意&#xff1a;跟随主观意识&#xff0c;也就是指有意识。 注意力机制&#xff1a;考虑“随意线索”&#xff0c;有一个注意力池化层&#xff0c;将会最终选择考虑到“随意线索”的那个值 二、注意力汇聚 这一部分也就是讲第一大点中“注意力汇聚”那个池化…...

特权FPGA之乘法器

完整代码如下&#xff1a; timescale 1ns / 1ps// Company: // Engineer: // // Create Date: 23:08:36 04/21/08 // Design Name: // Module Name: mux_16bit // Project Name: // Target Device: // Tool versions: // Description: // // Dependencies: …...

安全的企业局域网聊天工具哪个好用?

在当今数字化时代&#xff0c;企业对于局域网聊天工具的需求日益增长&#xff0c;尤其是在对数据安全和定制化服务有较高要求的大中型政企单位中。安全的企业局域网聊天工具哪个好用&#xff1f;虽然市面上有很多即时通讯软件&#xff0c;今天来介绍一下已经拥有十年行业经验的…...

如何应对客户频繁变更需求

如何应对客户频繁变更需求&#xff1f;要点包括&#xff1a; 快速响应、深入沟通、灵活规划、过程记录、风险管控。这些策略既能降低项目失控风险&#xff0c;也能帮助团队在变动环境中保持高效率。其中深入沟通尤为关键&#xff0c;它不仅能够让团队第一时间了解客户意图&…...

R语言进行聚类分析

目录 简述6种系统聚类法 实验实例和数据资料&#xff1a; 上机实验步骤&#xff1a; 进行最短距离聚类&#xff1a; 进行最长距离聚类&#xff1a; 进行中间距离聚类&#xff1a; 进行类平均法聚类&#xff1a; 进行重心法聚类&#xff1a; 进行ward.D聚类&#xff1a;…...

1.6-抓包技术(Burp Suite\Yakit抓包\Web、APP、小程序)

1.6-抓包技术&#xff08;Burp Suite\Yakit抓包\Web、APP、小程序&#xff09; 如果要使用抓包软件&#xff0c;基本上第一步都是要安装证书的。原因如下&#xff1a; 客户端&#xff08;浏览器或应用&#xff09;会检测到证书不受信任&#xff0c;并弹出 证书错误&#xff0…...

DAPP实战篇:使用web3.js连接合约

说明 本系列内容目录:专栏:区块链入门到放弃查看目录 如果你还没有创建好项目请先查看:《DApp实战篇:先用前端起个项目》,如果你还不知道web3.js是什么请先查看:《DApp实战篇:前端技术栈一览》。 安装 点此查看web3.js官方文档 打开项目根目录,并唤起终端: 键入w…...

用 Python 构建一个简单的本地视频流媒体服务器

你是否曾经想过在本地网络上轻松地将电脑上的视频分享给手机或平板电脑观看&#xff1f;也许你下载了一部电影&#xff0c;想在客厅的智能电视上播放&#xff0c;却不想费力地拷贝文件。今天&#xff0c;我们将深入分析一个 Python 脚本&#xff0c;它使用 wxPython 创建图形用…...

汇丰xxx

1. Spring Boot 的了解&#xff0c;解决什么问题&#xff1f; 我的理解&#xff1a; Spring Boot 是一个基于 Spring 框架的快速开发脚手架&#xff0c;它简化了 Spring 应用的初始搭建和开发过程。解决的问题&#xff1a; 简化配置&#xff1a; 传统的 Spring 应用需要大量的…...

ruby基础语法

以下是 Ruby 基础语法的简明总结&#xff0c;适合快速入门&#xff1a; 一、变量与常量 局部变量 小写字母或下划线开头&#xff0c;作用域为当前代码块。 name "Alice" _age 20实例变量 以 开头&#xff0c;属于对象实例。 name "Bob"类变量 以 开头…...

智体OS-V3.1版:新增了rt-datalink底层数据链通讯,实现【无网络】本机使用

##智体OS-V3.1版本发布 更新简介 dtns.os智体OS-V3.1版&#xff1a;新增了rt-datalink底层数据链通讯&#xff08;使用本地局域网的websocket端口通讯&#xff09;&#xff0c;解决了本机【无网络】正常使用的问题。 更新内容 dtns.connector支持使用新的rt-datalink与智体…...

Windows系统安装Git以及Git常用命令介绍

本文主要介绍Windows系统安装Git的方法&#xff0c;以及Git常用命令介绍。 一、下载Git 官网&#xff1a; Git - Downloads (git-scm.com) 根据自己的系统选择 我的是64位的Windows系统&#xff0c;选择对应的安装包&#xff0c;点击后开始下载 等待下载完成 二、安装Git 双…...

HTML 开发者的智能助手:通义灵码在 VSCode 中的应用

引言 在 HTML 开发领域&#xff0c;提高编码效率和质量是每位开发者追求的目标。通义灵码&#xff0c;作为一款由阿里云技术团队开发的智能编码助手&#xff0c;能够通过其强大的 AI 能力&#xff0c;为 HTML 开发者提供包括代码自动补全、智能注释、代码优化等多方面的支持。…...

MySQL随机获取记录之方法(The Method of Randomly Obtaining Records in MySQL)

MySQL中如何随机获取一条记录 随机获取一条记录是在数据库查询中常见的需求&#xff0c;特别在需要展示随机内容或者随机推荐的场景下。在 MySQL 中&#xff0c;有多种方法可以实现随机获取一条记录&#xff0c;每种方法都有其适用的情况和性能特点。在本文中&#xff0c;我们将…...

ngx_core_module 的 create_conf

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_core_module-CSDN博客 定义在 src\core\nginx.c ngx_module_t ngx_core_module {NGX_MODULE_V1,&ngx_core_module_ctx, /* module context */ngx_core_commands, /* module directives */…...

41--华为IPSec主备链路实验:当加密隧道遇上“双保险“

&#x1f6a6; 华为IPSec主备链路实验&#xff1a;当加密隧道遇上"双保险" “如果你的IPSec隧道只有一条路&#xff0c;那就像走钢丝不系安全带——刺激但危险&#xff01;” —— 本文将用华为设备打造主备双加密通道&#xff0c;结合IP-link智能检测&#xff0c;让…...

Reactive编程框架与工具

文章目录 6.2 后端 Reactive 框架6.2.1 Spring WebFlux核心架构核心组件实际应用高级特性性能优化适用场景与限制 6.2.2 Akka&#xff08;Actor模型&#xff09;Actor模型基础基本用法高级特性响应式特性实现性能优化实际应用场景优势与挑战 6.2.3 Vert.x&#xff08;事件驱动&…...

vi/vim常用快捷键

那么今天我们继续昨天没有介绍完的vi编辑器,来看看常用的一些快捷键,方便我们对文件的编辑. 1.拷贝当前行yy,拷贝当前行向下的5行5yy,并粘贴(输入p) 2.删除当前行dd,删除当前行向下的5行5d 3.在文件中查找某个单词[命令模式/关键字,回车查找,输入n就是查找下一个] ⭐️&…...

初始JavaEE篇 —— SpringBoot 统一功能处理

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 前言 拦截器 基本使用 拦截器的路径配置 统一数据返回格式 统一异常处理 前言 在实际开发中&#xff0c;某些功能需要强…...

Spring AI Alibaba 文档检索使用

一、文档检索 (Document Retriever)简介 1、核心概念 文档检索&#xff08;DocumentRetriever&#xff09;是一种信息检索技术&#xff0c;旨在从大量未结构化或半结构化文档中快速找到与特定查询相关的文档或信息。文档检索通常以在线(online)方式运行。 DocumentRetriever通…...

遍历算法及其应用详解

李升伟 整理 什么是遍历&#xff1f; 遍历是指按照某种规则或顺序&#xff0c;系统地访问数据结构&#xff08;如树、图等&#xff09;中的每个节点一次且仅一次的过程。遍历是算法设计中的基本操作&#xff0c;用于访问、检查或修改数据结构中的所有元素。 主要遍历算法 1…...

.NET-EFCore基础知识

.NET EF Core&#xff08;Entity Framework Core&#xff09;是微软开发的一款开源的对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;用于在.NET 应用程序中与数据库进行交互。以下是一些.NET EF Core 的基础知识&#xff1a; 1. 什么是 EF Core EF Core 是.NET 平…...

R语言基础包可视化(一:axis函数)

R语言基础包可视化(一:axis函数) 背景axis函数(坐标轴函数)各参数的图片示例hadj和padjline和poslty,lwd,lwd.ticksgap.axis总结背景 之前在介绍正态Q-Q图的过程中,画过标准正态分布的随机数、分数数、分布函数、密度函数的图像,相关的文章连接参考此处:R语言正态Q-Q图…...

Axure疑难杂症:垂直菜单折叠与展开(玩转垂直菜单)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:垂直菜单折叠与展开 主要内容:折叠与展开效果 应用场景:PC后台菜单、动态下拉菜单、商品分类选择等折叠与展开场景 案例展示: 案例视频: 垂直菜单折叠与展开效果 正文内容: 关于垂直菜单的折叠与…...

docker 中跑faster-whisper 教程(1050显卡)

之前我本地机器运行faster-whisper 会报错类似 Could not load library libcudnn_ops_infer.so.8github 上也有类似的情况 &#xff1a;https://github.com/SYSTRAN/faster-whisper/issues/516#issuecomment-2785038635 缺少.so.8 文件&#xff0c;我通过以下方式&#xff0c;…...

MySQL 在 CentOS 7 环境安装完整步骤

1. 卸载已有环境&#xff08;MariaDB/旧版MySQL&#xff09; 1.停止 MariaDB 服务 systemctl stop mariadb.service 2.检查并卸载 MariaDB/MySQL 安装包 rpm -qa | grep mariadb # 检查 MariaDB 相关包 rpm -qa | grep mysql # 检查 MySQL 相关包 sudo yum remo…...

下一代智能爬虫框架:ScrapeGraphAI 详解

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、ScrapeGraphAI 概述1.1 ScrapeGraphAI介绍1.2 核心特点1.3 工作流程1.4 关键模块1.5 对比传统爬虫框架1.6 安装二、基础操作2.1 自定义解析规则2.2 数据后处理2.3 分布式爬取三、高级功能3.1 多步骤交互采集3.2 动态…...

C++-ffmpeg-2-3-工厂模式封装SDL-9-7

1.接口设计 2.窗口渲染器和材质初始化 3.渲染Draw并测试渲染YUV 4.渲染画面随窗口大小自动缩放并抗锯齿 5.清理接口和接收窗口退出事件 1.接口设计&#xff1a;原则 主要的实现步骤&#xff1a; main的流程&#xff1a; 1打开文件 yuv_file.open("400_300_25.yuv&quo…...

下载极客漫画——Beautiful Soup实用案例

文章目录 一、背景介绍 二、实现思路 三、效果图 四、构思 五、实现细节 1. 第一步下载网页 2. 寻找和下载漫画图像 3. 保存图像&#xff0c;找到前⼀张漫画 六、完整代码 七、程序输出 八、附录 九、总结 一、背景介绍 XKCD网站是一个关于浪漫、隐喻、数字、以及…...

【大模型理论篇】SWIFT: 可扩展轻量级的大模型微调基础设施

1. 背景 大模型(LLM)和多模态大模型(MLLM)利用基于Transformer的架构获得了很迅速的发展。为满足对这些模型的训练和轻量级微调需求&#xff0c;目前已有一些开源框架&#xff0c;如LLaMA-Factory、Firefly、FastChat、Axolotl和LMFlow等。但这些框架在支持的模型、技术和功能上…...

利用 schedule 模块在每日上午每 3 秒执行任务

一、schedule 模块基础原理与功能概述 schedule 模块维护了一个任务队列,每个任务都关联着一个特定的时间触发器和对应的执行函数。当系统时间到达任务设定的触发时间时,模块会从队列中取出相应的任务并执行其关联的函数。这种设 计模式使得开发者无需过多关注底层的时间处理…...

ruby超高级语法

以下是 Ruby 中一些 极度硬核 的语法和底层特性&#xff0c;涉及元编程的深渊、虚拟机原理、语法黑魔法等&#xff0c;适用于追求极限的 Ruby 开发者&#xff1a; 一、语法核弹级操作 1. 动态修改继承链 class A; def foo; "A"; end end class B; def foo; "B…...

Java Stream API:现代化集合处理的艺术

Java Stream API:现代化集合处理的艺术 引言 在Java 8中引入的Stream API彻底改变了我们处理集合数据的方式。它不仅仅是一个新的工具集,更代表了一种声明式、函数式的编程范式。本文将深入探讨Java Stream的核心概念、使用场景和最佳实践。 一、什么是Stream? Stream(…...

ruby高级语法

以下是 Ruby 高级语法的详细总结&#xff0c;涵盖元编程、模式匹配、闭包、并发模型等核心主题&#xff1a; 一、元编程&#xff08;Metaprogramming&#xff09; 1. 动态定义方法 class DynamicClass# 使用 define_method 动态定义方法["foo", "bar"].e…...

特权FPGA之UART串口

0.简介 通用异步收发器(Universal Asynchronous Receiver&#xff0f;Transmitter&#xff0c;UART)可以和各种标准串行接口&#xff0c;如RS 232和RS 485等进行全双工异步通信&#xff0c;具有传输距离远、成本低、可靠性高等优点。一般UART由专用芯片如8250&#xff0c;1645…...

oracle 索引失效

在 Oracle 11g 中&#xff0c;索引失效的常见原因包括函数修改列、隐式类型转换、统计信息过时等&#xff0c;解决方法需结合版本特性&#xff08;如虚拟列、索引跳跃扫描&#xff09;。通过执行计划分析、统计信息维护和合理使用提示&#xff08;Hints&#xff09;&#xff0c…...

MySQL查看binlog执行情况

因数据丢失&#xff0c;被要求使用binlog查看 执行SQL的具体情况。 拿到数据库压缩包&#xff0c;解压缩获得文件和文件夹若干。 如图&#xff0c;有17个binlog文件&#xff0c;目标数据库名应为corr。 已知这个数据库是安装在windows下&#xff0c;版本8.0. 先下载一个mysq…...

kotlin,Android,jetpack compose,日期时间设置

AI生成&#xff0c;调试出来学习&#xff0c;这些小组件会用了&#xff0c;就可以组合一个大点的程序了。 package com.example.mydatetimeimport android.app.AlertDialog import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.co…...

sql-labs靶场 less-2

文章目录 sqli-labs靶场less 2 联合注入 sqli-labs靶场 每道题都从以下模板讲解&#xff0c;并且每个步骤都有图片&#xff0c;清晰明了&#xff0c;便于复盘。 sql注入的基本步骤 注入点注入类型 字符型&#xff1a;判断闭合方式 &#xff08;‘、"、’、“”&#xf…...

ssh密钥连接远程服务器并用scp传输文件

ssh密钥连接远程服务器 私钥的权限必须是600chmod 600 id_rsa连接时在命令中加上私钥的地址ssh -i PATH_to_id_rsa usernameip -p port scp -P port -i PATH_to_id_rsa file usernameip:PATH...

【锂电池SOH预测】PSO-BP锂电池健康状态预测,锂电池SOH预测(Matlab完整源码和数据)

预测效果 基于PSO-BP算法的锂电池健康状态预测研究 一、引言 1.1 研究背景与意义 在当今社会&#xff0c;锂电池凭借其高能量密度、长寿命及环境友好等特性&#xff0c;在现代能源系统中占据着举足轻重的地位。从消费电子领域如智能手机、笔记本电脑&#xff0c;到动力领域中…...

找搭子系统 搭子经济新风口 基于精准匹配的社交新生态探索

一、市场前景&#xff1a;为什么现在需要"找搭子"&#xff1f; 孤独经济爆发 超60%年轻人存在"精准陪伴"需求&#xff08;2024社交报告&#xff09; 传统社交App无法满足"非婚恋、非熟人"的中间态需求 线下活动复苏 剧本杀/飞盘等兴趣活动年增…...

《Spring Boot+策略模式:企业级度假订单Excel导入系统的架构演进与技术实现》

前言 在数字化时代背景下&#xff0c;订单管理系统的高效性与灵活性成为企业竞争力的核心要素。本文档详细剖析了一个基于 策略模式 的度假订单导入系统&#xff0c;通过分层架构设计实现了多源异构数据的标准化处理。系统以 Spring Boot 为核心框架&#xff0c;结合 MyBatis …...

软件需求分析习题汇编

需求工程练习题 一、选择题 1. 软件需求规格说明书的内容不应包括对&#xff08; &#xff09;的描述。 A. 主要功能B. 算法的详细过程C. 用户界面及运行环境D. 软件的性能 *正确答案:*B:算法的详细过程; 2. 需求分析最终结果是产生&#xff08; &#xff09; A. 项目开发…...

51单片机的汇编伪指令

目录 一、ORG 汇编起始地址命令 1、功能 2、语法格式 3、使用示例 4、注意事项 二、END 汇编终止命令 1、功能 2、语法格式 3、使用示例 4、注意事项 三、EQU 赋值命令 1、功能 2、语法格式 3、使用示例 4、注意事项 四、BIT 位定义命令 1、功能 2、语法格式…...

深入探究Python的re模块及其在爬虫中的应用

深入探究Python的re模块及其在爬虫中的应用 一、引言 在Python的强大生态系统中&#xff0c;re模块作为处理正则表达式的核心工具&#xff0c;发挥着举足轻重的作用。正则表达式是一种描述文本模式的强大语言&#xff0c;能够高效地进行字符串的匹配、查找、替换等操作。无论…...

aosp13增加摄像头控制功能实现

A13中&#xff0c;可以要求做一个开关来控制摄像头是否可用&#xff0c;约束所有使用摄像头的应用。思路&#xff1a;设置中增加开关设置一个属性值&#xff0c;在摄像头调用实现层增该值判断即可 一 开关的开发&#xff1a; 设置-安全中增加开关选项 代码部分&#x…...

Kotlin 之 vararg 参数向下传递的几种方式

在 Kotlin 中&#xff0c;vararg 参数是一种特殊的参数类型&#xff0c;用于表示可变数量的参数。vararg 参数是否可以向下传递&#xff0c;需要根据目标方法的参数类型来决定。 1、目标方法参数也是vararg类型&#xff0c;可直接向下传递 在 method 方法中&#xff0c;通过 …...

Kotlin学习

kotlin android 开源,Kotlin开源项目集合_晚安 呼-华为开发者空间 干货来袭&#xff0c;推荐几款开源的Kotlin的Android项目...