C语言程序结构深度拆解:从编译链接到内存布局
写过几年 C 的人大概都有过类似经历代码看着很对编译却报错编译能过一跑就崩。很多人第一反应是语法不够熟、算法写错了可查来查去最后往往发现是程序的结构出了问题。这里说的结构不只是代码排版而是从源文件组织、函数划分、数据布局到编译链接全过程的整套框架。我打算把这套东西从头到尾拆一遍无论你是刚开始学 C、正在准备期末还是写过几个小项目想沉淀一下这篇都值得花十分钟读完。下面我从一个最简单的问题开始一段 C 代码到底是怎么变成可执行程序的搞懂这一步后面所有“结构”才有着落。1. 先搞清楚一件事C 程序从按键到运行的完整旅程很多人学 C 的第一天就在 IDE 里点“运行”看到屏幕输出 hello world 就以为完事了。但那一瞬间你的hello.c其实悄悄经历了预处理、编译、汇编、链接四道工序每一道工序都在改变程序的“结构形态”。1.1 预处理C 语言的第一道工序预处理是编译前的一趟文本替换它不检查语法只是按指令机械地处理文本。常见的预处理指令包括#include、#define、#ifdef等。比如你写#include stdio.h #define PI 3.14159 int main(void) { printf(%.5f\n, PI); return 0; }用gcc -E hello.c -o hello.i展开之后hello.i里会多出来几百上千行内容。stdio.h里声明的printf、FILE、stdin、stdout全都被原样粘贴到你的代码前面而PI则被直接替换成3.14159。这里容易误解的是#include不是“引入一个库”而是“把另一个文件的内容复制粘贴到这里”。它本质是文本级别的拼接。所以你会看到limits.h这类头文件——它定义的INT_MAX、INT_MIN不过是若干#define宏预处理之后这些宏名就消失了变成了具体的数字。预处理阶段还承担条件编译的职责。同一个源码文件可以通过#ifdef _WIN32之类的分支在不同平台下编译出不同的代码结构。很多跨平台项目能在 Windows 和 Linux 下同时编译靠的就是这套机制。1.2 编译与汇编把人类语言翻译成机器语言预处理之后编译器开始做真正的翻译。词法分析把代码拆成一个个单词标识符、关键字、运算符语法分析检查这些单词的组合是否符合 C 语法语义分析进一步确认类型是否匹配、声明是否完整。这些都通过之后编译器把源码转成汇编代码也就是gcc -S hello.i -o hello.s能看到的那种文本。用gcc -S -O0和gcc -S -O2分别生成汇编对比一下你能直观感受到优化器做了什么-O0时局部变量经常被搬进搬出栈内存-O2时很多中间变量可能直接被优化没了。C 语言之所以被称为“close to the metal”就是因为它能让你通过汇编这一层看到 1:1 的底层映射。汇编器接着把汇编代码转成目标文件也就是.o文件。这个文件里已经是机器指令了但还不能运行因为printf的机器码不在你的hello.o里它在系统库中。1.3 链接把散落的零件组装成能跑的程序链接器的工作是把多个目标文件和库文件拼在一起解决符号引用关系你的代码调用了printf链接器就要从 C 运行库里找到printf的实现地址把调用指令“补全”。这个过程分为静态链接和动态链接静态链接把库代码直接复制进最终可执行文件动态链接则留一个运行时加载的接口。举一个很常见的链接错误你在代码里写了sqrt(x)编译通过但链接时报出undefined reference to sqrt。原因是数学函数在libm库中默认链接并不会自动带上你得在编译命令的末尾加-lm。这说明编译和链接是两道独立的工序很多初学者把报错一股脑归咎于“编译器”其实应该先分清这个错误来自编译期还是链接期。把一个.c文件变成可执行文件本质上就是一趟“翻译 组装的流水线”。理解了这条流水线后面讲多文件工程时你会一下子明白为什么改一个.c文件只需要重新编译那一个文件然后重新链接就行而不是把整个项目从头翻一遍。2. 解剖一个 .c 源文件C 程序的语法骨架看过了程序在编译链路上的形态我们把视线落回源代码本身。一个.c文件里能写的东西归纳起来无非是预处理指令、类型定义、全局变量定义、函数定义这几类。它们之间的组织方式决定了这个源文件的“骨架”是否清晰。2.1 main 函数为什么一切从 main 开始每个 C 程序都有一个入口点也就是main函数。操作系统加载可执行文件后不会直接跳到你的main执行——它先经过一段 C 运行时启动代码crt完成环境初始化比如准备argc、argv、初始化标准 I/O 缓冲区然后才调用main。标准写法有两种不需要命令行参数时用int main(void)需要时用int main(int argc, char *argv[])。void main()这种写法在部分老编译器里能过但不符合标准遇到严格模式的编译器会直接警告甚至报错。至于return 0它表示程序正常结束这个返回值由启动代码接收最终通过exit系统调用交还给操作系统。很多初学者容易把整个功能全塞进main里输入、计算、输出、错误处理全堆在一起几十行甚至上百行。小程序固然能跑但一旦逻辑变复杂函数的划分就成了程序结构的第一道分水岭。一个好的main通常只负责串联流程细节交给子函数。2.2 声明、定义和语句代码到底由什么拼成先分清一对最容易混淆的概念——声明和定义。声明告诉编译器“存在这样一个东西”定义则真正为它分配存储空间。例如extern int count; // 声明count 在别的文件里定义 int count 0; // 定义为 count 分配内存函数也一样int add(int a, int b);是声明下面带函数体的才算定义。之所以强调这个区别是因为链接期的很多报错都源于“只有声明没有定义”或“同一个符号被定义了多次”。语句方面C 的语句大致可分为表达式语句、复合语句、选择语句、循环语句和跳转语句。x a b;是表达式语句{}包起来的一串是复合语句if-else是选择while、do-while、for是循环。说到while和do-while这两兄弟就是“先判断后执行”和“先执行后判断”的区别。do-while循环体至少执行一次比如你要先从用户输入里读一个数若不合法就重新读用do-while就很顺手而while可能一次都不执行。很多练习题比如九九乘法表、字符串逆序、输入日期计算是第几天本质上都是顺序结构搭上循环结构的结果。结构化程序设计里那句“顺序、选择、循环”三大结构说的就是 C 语言代码层面的基本骨架。2.3 头文件怎么用stdio.h 和 limits.h 只是冰山一角#include stdio.h大概是每个初学者写过的第一行代码但很少有人思考头文件里到底该放什么。头文件的典型内容包括类型定义typedef、结构体、宏定义#define、函数原型声明、extern变量声明。它扮演的是“接口清单”的角色告诉使用方这个模块提供了哪些功能、数据格式长什么样。limits.h是最典型的标准库头文件之一它给出各整数类型的取值范围比如INT_MAX、LONG_MIN。跨平台代码尤其依赖这些东西你不能假设int一定占 4 字节但你可以通过limits.h拿到当前平台的边界值。头文件里最忌讳的是放函数定义和全局变量定义。因为在预处理阶段头文件会被复制进每个包含它的.c文件如果头文件里定义了函数两个.c文件都包含它链接时就会出现重复定义错误。初学者喜欢把“所有代码都塞进一个.h”其实是把头文件当成了普通源文件这个习惯越早改越好。3. 程序运行时数据在内存里是怎么“摆”的源码结构是静态的程序一旦跑起来变量、指针、数组这些数据就会落到真实的内存区域。C 语言里许多诡异的问题比如局部变量莫名被改写、缓冲区溢出、递归栈溢出根源都在于对内存结构的理解不够。3.1 作用域、链接属性和存储类别先把变量分类搞明白C 的变量可以从三个维度去看作用域它在哪段代码里可见、生命周期它什么时候诞生、什么时候销毁、存储位置它住在哪块内存。下表是常见变量类型的对比变量类型存储位置作用域生命周期默认初值局部自动变量栈定义处到所在块结束进入块时创建离开块时销毁随机值静态局部变量数据段 / BSS与局部变量相同程序启动到程序结束全零全局变量数据段 / BSS整个源文件及外链部分程序启动到程序结束全零extern 引用变量定义所在处跨文件可见由定义决定由定义决定静态局部变量是个极容易踩坑的点。它作用域虽然在函数内但生命周期是整个程序函数第一次执行时初始化一次之后函数退出也不会销毁。比如写计数器int next_id(void) { static int id 0; return id; }每次调用next_idid都会在上一次的基础上递增。如果把static去掉id每次调用都会重新归零逻辑就完全变了。3.2 栈、堆、数据段程序在内存里的四块地盘一个典型的 C 程序进程内存布局大致分这几块代码段放机器指令、数据段放已初始化的全局变量和静态变量、BSS 段放未初始化的全局变量和静态变量加载时自动清零、堆程序运行时动态分配的内存、栈函数调用时存放局部变量和调用信息。栈和堆朝着相反方向生长栈向下堆向上。每次函数调用都会压入一个栈帧里面存放局部变量、函数参数、返回地址。递归每深入一层就多一个栈帧递归太深就会把栈耗尽出现stack overflow。你听过的“栈溢出”并不是一句玩笑它真的就是把这段栈空间踩爆了。堆上的内存由你说了算malloc申请free释放。一个很常见的结构问题是“只申请不释放”小工具跑几秒可能没事但写成服务器程序跑一天就会发现内存持续上涨这就是内存泄漏。另一个常见问题是“释放后再访问”指针已经所指向的内存被回收再读它会得到未定义行为。虚拟存储器的概念也值得了解一下每个进程看到的是独立的虚拟地址空间操作系统负责把虚拟地址映射到物理内存。这意味着一个程序里的地址并不直接等于内存条上的物理位置也解释了为什么数组越界访问有时不立刻崩溃——你踩到的可能只是映射内的另一块数据直到踩到未映射的页才触发段错误。3.3 数组、指针和结构体C 语言的“结构三件套”数组是 C 语言里最基础的数据聚合方式一段连续内存存同类型元素。字符串在 C 里就是char数组以\0结尾。很多经典练习题——字符串逆序、冒泡排序、求 5×5 矩阵的鞍点、日期计算——练来练去都在训练同一个能力用循环配合下标访问数组并用数组组织一批数据。指针存的不是数据本身而是数据的地址。它可以指向数组的第一个元素也可以指向结构体的某个字段。指针和数组常常如影随形char *p hello;和char s[] hello;看起来差不多但前者指向只读字符串字面量后者是本地可修改的数组副本。很多人写字符串逆序程序时试图修改字符串字面量结果直接段错误根因就在这一步。结构体则把不同类型的数据打包成一个新的类型struct Student { char id[16]; int age; double score; };结构体内部有内存对齐的规则编译器会在字段之间插入填充字节让每个字段的地址满足对齐要求。所以sizeof(struct Student)并不总是等于各字段大小之和。从这里开始你已经摸到了“数据结构”的大门——链表节点、二叉树节点本质上都是结构体里塞了指针指针再指向下一个结构体。4. 大型 C 项目从单文件到多文件的工程化结构单个.c文件里写几百行并不稀奇可一个稍有规模的项目动辄上万行如果全堆在同一个文件里任何人接手都会想哭。C 语言的工程结构核心就一句话把一个大问题拆成若干小模块每个模块负责一个清晰的职责模块之间通过头文件暴露接口。4.1 接口与实现分离.h 和 .c 该怎么分工一个典型模块通常由一个.c文件和一个.h文件组成。.h放对外可见的声明.c放具体实现。比如做一个学生成绩统计的小项目可以拆成input.c、stats.c、output.c和main.c。stats.h可能长这样#ifndef STATS_H #define STATS_H double average(const int scores[], int n); int max_score(const int scores[], int n); int min_score(const int scores[], int n); #endifstats.c在开头#include stats.h然后实现这三个函数。main.c只需要#include stats.h就能调用average完全不需要知道average内部怎么实现。这就是接口与实现分离接口稳定实现随便改只要函数签名不变调用方代码就不用动。这个思路对初学者尤其重要。你刷题时可以先把功能拆成“读数据、算结果、打印结果”三个阶段为每个阶段写一个函数最后在main里按顺序调用。哪怕只是一个几十行的练习这种拆分也能帮你厘清思路比直接堆代码好改得多。4.2 头文件守卫和 include 策略别让重复定义找上门前面提过#include是文本复制。如果a.h里#include b.h而main.c又同时包含a.h和b.hb.h的内容就会被复制两份。对于纯声明重复几次问题不大但如果b.h里有类型定义编译就会报“类型重定义”。解决办法是给每个头文件加守卫#ifndef B_H #define B_H /* 头文件内容 */ #endif有了这份守卫同一个编译单元里头文件内容只会展开一次。另一种写法#pragma once效果类似但不是标准 C 的关键字个别编译器可能不支持。我会更推荐用#ifndef的方案完全可移植。还有两个实践经验一是头文件尽量“自包含”也就是说一个.h单独被#include时也能编译通过不要依赖别人先包含它二是头文件里尽量少 include 其他头文件能用前置声明解决的就不引入完整定义。这样能显著降低编译时间。很多项目一开始编译很快后来每改一行代码都要等半天多半是头文件之间互相 include 太多造成的。4.3 增量编译与 Makefile把多个文件组织起来既然每个.c文件都会单独编译成.o文件那么修改一个文件理论上只需要重新编译这个文件再链接一次。Makefile 就是帮你做这件事的工具。一个简单示例CC gcc CFLAGS -Wall -g -O2 main: main.o input.o stats.o output.o $(CC) $(CFLAGS) -o main main.o input.o stats.o output.o main.o: main.c input.h stats.h output.h $(CC) $(CFLAGS) -c main.c input.o: input.c input.h $(CC) $(CFLAGS) -c input.c stats.o: stats.c stats.h $(CC) $(CFLAGS) -c stats.c output.o: output.c output.h $(CC) $(CFLAGS) -c output.c clean: rm -f *.o main用make构建时它会检查目标和依赖文件的时间戳如果stats.c比stats.o新就重新编译stats.c如果main.c没改过main.o也不必重新生成。这就是增量编译项目越大优势越明显。很多同学在 VS Code 或虚拟机里配 C 语言环境折腾了半天其实底层就是在配置这条工具链编译器gcc、构建工具make、调试器gdb。无论 IDE 把一键运行做得多么省事理解这些命令本身仍然很重要——因为你迟早会遇到 IDE 跑不起来、只能回终端手动排查的时候。5. 结构问题排查实录从编译期到运行期写代码不可能不出错关键是快速定位。我的习惯是先把问题分阶段编译期、链接期、运行期。不同阶段的报错成因完全不同排查手段也完全不同。5.1 编译期语法错误和类型不匹配怎么快速定位编译期错误大多是语法问题或类型问题。比如int a scanf(%d, a);少了分号编译器报error: expected ; before scanf。要注意的是编译器报的出错行通常是“检查到问题的那一行”而不一定是真正漏掉东西的那一行所以要往前一行看。还有一类典型问题是隐式函数声明在 C99 之前的旧标准里调用未声明的函数只会给个警告但现代编译器基本都会报错。解决方案很简单#include对应的头文件或者在使用前声明函数原型。给一个非常实用的编译建议用-Wall -Wextra编译把警告当成错误来对待。警告不是“看了一眼就完事”的东西它往往在提示你潜在的结构问题比如变量声明了没用、整数可能被截断、格式化字符串和参数类型不匹配。5.2 链接期undefined reference 和重复定义的成因链接期两种最常见的错误一个是undefined reference to xxx一个是duplicate symbol xxx。前者表示整个链接过程中没有找到符号xxx的定义。常见原因有三类第一函数声明了但忘了写函数体第二函数定义在另一个.c文件里但链接命令没有把那个.o文件加进来第三依赖了某个库但忘了加链接参数。排查时先用grep确认符号拼写是否一致再看编译链接命令里是否少文件、少-l参数。后者表示同一个符号被定义多次。最常见的原因是头文件里放了函数定义或全局变量定义然后这个头文件被多个.c包含每个编译单元里都有一份定义链接器不知道该选哪一个。正确做法是头文件里只放extern声明和函数原型定义放到其中一个.c文件里。5.3 运行期段错误、缓冲区溢出和内存泄漏运行期的结构问题更隐蔽因为它不是每次运行都会复现。最让人抓狂的段错误Segmentation fault常见原因就是空指针访问、数组越界、访问已释放内存。定位段错误的第一利器是 gdb。我写过的一个字符串逆序小程序曾经崩溃排查过程是这样的先用gcc -g编译保证调试符号进可执行文件然后用gdb ./a.out启动输入run复现崩溃崩溃后输入bt查看调用栈再frame 1跳到对应层级print相关变量。很快就能看到栈帧里某个指针是 NULL 或者指向了非法地址。这套流程你在 IDE 里双击断点也能做但 gdb 的输出信息更加直接。缓冲区溢出也值得一提。很多练习题里用到scanf(%s, str)如果输入超过数组长度数据就会写到数组边界之外破坏相邻内存。轻则变量被改写重则段错误。安全的替代方案是fgets或者给出宽度限制scanf(%9s, str)。文件读写会涉及文件缓冲区——fprintf写的内容不会立刻落盘而是先进入缓冲区等缓冲区满、调用fflush或fclose时才真正写入。程序非正常退出时缓冲区的数据可能就丢了。所以处理重要文件时写完立刻fflush或fclose别把文件内容安全完全寄托在“应该会自动刷新”上。至于内存泄漏gdb 帮不上太多忙我一般用 valgrindvalgrind --leak-checkfull ./a.out它会清楚列出哪一行malloc的内存没有被free。养成了定期跑 valgrind 的习惯之后内存相关的错误能减少一大半。5.4 结构问题速查表现象可能原因处理方向undefined reference to xxx函数只有声明没有定义或链接命令少了.o/ 库检查拼写与链接命令补上定义或-l参数duplicate symbol xxx头文件里放了定义多个.c包含导致定义多份头文件只留声明定义移到.cSegmentation fault空指针、越界、访问已释放内存用 gdbbt定位崩溃栈检查指针和数组边界全局变量值在另一个文件里变了各.c各有一份拷贝或未用 extern 正确共享检查是否在.h里定义了变量统一用 extern程序输出乱码或多字符字符串缺少\0或格式串与参数不匹配检查字符串结尾确认%s、%d与参数类型一致文件内容没有及时写入缓冲区未刷新程序异常退出写后调用fflush或fcloseC 语言我写了十几年如果只能分享一条经验我会说先设计结构再写代码。这句话听起来太“正确”了像句废话但大部分后期失控的项目都是因为一开始没想清楚。做练习题也一样拿到“输入日期计算是第几天”“求 5×5 矩阵鞍点”这种题先想清楚输入、处理、输出三个阶段再动手写循环和数组代码自然清爽。我自己后来养成的一个习惯是写完程序不急着点运行先在终端里用gcc -Wall -g手动敲一遍编译命令盯着每一步的报错改。这个过程看着慢却能让你真正看到程序结构是怎么被组装起来的——毕竟结构这东西碰过几次壁之后才会真正长在自己身上。

相关新闻

基于Java的车辆维修管理系统:Spring Boot+MyBatis部署与二次开发全攻略

基于Java的车辆维修管理系统:Spring Boot+MyBatis部署与二次开发全攻略

简介:一套基于Java的车辆故障维修管理系统,面向汽车维修企业的数字化管理需求,可供毕业设计、课程设计或中小型维修门店的流程规范化参考。系统涵盖车辆信息、故障记录、维修订单、配件库存与财务报表等核心模块,并采用多用户权限…

2026/10/5 4:45:38 阅读更多 →
配网 PMU微型同步相量测量单元(D-PMU / μPMU,广州智昊:PMU3300-配网微型同步相量测量单元)

配网 PMU微型同步相量测量单元(D-PMU / μPMU,广州智昊:PMU3300-配网微型同步相量测量单元)

配网 PMU微型同步相量测量单元(D-PMU / μPMU,广州智昊:PMU3300-配网微型同步相量测量单元) 配网 PMU微型同步相量测量单元(D-PMU / μPMU,微型同步相量测量单元) PMU同步相量测量装置分为二款:…

2026/10/5 4:44:38 阅读更多 →
C51单片机红外遥控开发实战:NEC协议解码与发射全解析

C51单片机红外遥控开发实战:NEC协议解码与发射全解析

1. 为什么C51单片机至今仍是红外遥控开发的“隐形主力”你可能在智能家电维修现场见过老师傅掏出一块边缘泛黄的STC89C52开发板,用万用表测着红外接收头的3脚电压;也可能在淘宝上搜“红外遥控套件”,90%的商品详情页第一行写着“基于经典C51单…

2026/10/5 4:44:38 阅读更多 →

最新新闻

DeepSeek房地产获客实战:文本微表情分析与AI话术生成

DeepSeek房地产获客实战:文本微表情分析与AI话术生成

简介:面向房地产营销与自然语言处理技术人员的深度技术方案,基于深度求索(DeepSeek)大模型,系统讲解客户微表情分析与智能话术生成在精准获客中的完整应用。文档全书137页,分为51个大章节,内容从…

2026/10/5 7:12:31 阅读更多 →
VirtualBox与Win11内核隔离冲突:原理、排查与解决方案

VirtualBox与Win11内核隔离冲突:原理、排查与解决方案

最近很多朋友在老版本VirtualBox上栽了跟头:Windows 11明明把VT-x都开了,硬件加速还是灰的;有的直接弹0x80004005,虚拟机一个都起不来;还有人装完VirtualBox,发现“虚拟交换机”和网卡一起消失了。我在帮人…

2026/10/5 7:12:31 阅读更多 →
计算机网络核心考点精讲:从分层模型到TCP/IP与子网划分

计算机网络核心考点精讲:从分层模型到TCP/IP与子网划分

计算机网络这门课,在计算机专业的地位不用我多说了,不管是考研408、期末考,还是大厂面试、日常开发排查问题,它都是“重要且高频”的常客。我这些年带过不少新人,也帮人做过考前突击,发现很多人卡住不是因为…

2026/10/5 7:12:31 阅读更多 →
计算机网络上篇高频考点复习地图:物理层到网络层一次理清

计算机网络上篇高频考点复习地图:物理层到网络层一次理清

如果你正在准备考研、期末或者校招面试,大概都听过这么一句话:计算机网络重要,但容易学“散”。尤其是基本参考书里的“上篇章”,在408、期末卷和面试题里出现的频率都很高,可很多人复习到后面才发现,物理层…

2026/10/5 7:12:31 阅读更多 →
CLion中文乱码排查与解决:源码、编译器、控制台三步统一

CLion中文乱码排查与解决:源码、编译器、控制台三步统一

CLion 跑个printf("你好"),控制台直接吐出一堆火星文,这事估计每个从 Visual Studio 或者老工程迁过来的同学都撞见过。更气人的是网上搜出来的改法五花八门,今天改个编码明天又乱了,尤其 Windows 平台,CLio…

2026/10/5 7:12:31 阅读更多 →
Android Studio乱码详解:从控制台到文件的完整解决方案

Android Studio乱码详解:从控制台到文件的完整解决方案

搞 Android 开发的人,十有八九都遇到过 Android Studio 控制台或文件乱码的问题。不管你是刚装好 IDE 跑第一个 Hello World,还是维护一个老项目到一半,突然发现日志输出全是“锟斤拷”或者“���&#xfff…

2026/10/5 7:11:31 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →