简单明了的区分C++ C语言中声明(declaration)、定义(definition)、签名(signature)的区别

C++中definition与declaration的区别 翻了好几篇关于definition与declaration和博客,都写的很坑人 ,看来我得写一篇了,避免很多新手一入门就被坑了。definition是通过declaration完整的定义了实体,每个declaration都是definition。 阅读详情

无论是在C或者C++中,我们常常把声明和定义给弄混淆了,分不清楚,天真的认为这个两个东西是没有任何的区别,但是其实不以为然。下面我们来简单的阐述这两者的区别。

  • 何为声明(declaration)?
    声明的英文名为 declaration。 C/C++ 中使用声明时,仅仅是告诉编译器某个东西的类型和名称,不分配实际的内存空间,不提供存储的位置和具体实现的细节。

    extern itn x;                   // 变量声明
    std::size_t func(int num);      // 函数声明
    class Widget;                   // 类声明
    
    template<typename T>            // 模板声明
    class Student;
    
  • 何为定义(definition)?
    定义的英文名为 definition, C/C++ 中使用定义时,编译器要给变量分配实际的内存空间,提供存储的位置和具体实现的细节。

    int x;          // 对象定义,编译器为对象分配内存;此处对象非面向对象中的对象
    
    // 对function 或function template而言,定义提供了代码的本体
    std::size_t func(int num)
    {
      std::size_t a;
      return (a + 10);
    }
    
    // class 定义
    class Widget
    {
    public:
      Widget();
      ~Widget();
      ......
    };
    
    // 模板定义
    template<typename T>            
    class Student
    {
    public:
      Student();    
      ~Student();    
    };
    
    • 注意:在程序中变量可以有多次声明,但只能 定义一次。
  • 签名(signature)

    • C++ 官方定义中,签名就是函数的参数部分,不包括函数的返回类型。但习惯上一般把函数返回类型和参数都作为签名的部分。
    • 例如函数声明中 std::size_t func(int num);,func 函数签名为 std::size_t 和 int
函数调用参数不匹配错误全解析:从C语言到命令行 函数调用是编程中的基础概念,它遵循严格的参数匹配原则。在静态类型语言如C/C++中,编译器会在编译阶段检查函数调用时实参与形参的数量、类型是否一致,若参数数量不匹配,会直接报错“参数太少/太多”。这一机制确保了代码的早期错误检测。在动态语言如Python中,参数数量检查延迟到运行时,但仍会抛出TypeError。其技术价值在于保障程序执行的正确性和稳定性,避免因参数传递错误导致的未定义行为或逻辑错误。应用场景广泛,从底层硬件驱动开发到Web应用构建都会涉及。例如,在配置`ds18b20`温度传感器时,参数传 阅读详情

相关推荐

StarCoder开源代码大模型深度解析:80+语言支持与ALiBi架构实践

代码大模型是面向软件开发任务的专用大语言模型,其核心在于对编程语言语法、工程规范与上下文结构的深度建模。StarCoder通过1万亿token高质量代码语料、ALiBi位置编码与长上下文优化,在80+编程语言覆盖、零样本长度外推和微调稳定性上实现突破。相比通用大模型,它不追求对话能力,而是聚焦‘意图→结构→合法语法→语义一致’的生成链路,显著提升代码补全、测试生成与跨语言契约校验等场景的生产可用性。本文深入剖析其语料构建逻辑、ALiBi架构优势及五层提示工程方法,为开发者提供可落地的开源代码模型实践指南。

weixin_33670713的博客 504

C++中的函数签名

C++中的函数签名(function signature):包含了一个函数的信息,包括函数名、参数类型、参数个数、顺序以及它所在的类和命名空间。普通函数签名并不包含函数返回值部分,如果两个函数仅仅只有函数返回值不同,那么系统是无法区分这两个函数的,此时编译器会提示语法错误。函数签名用于识别不同的函数,函数的名字只是函数签名的一部分。在编译器及链接器处理符号时,使用某种名称修饰的方法,使得每个函数签名对应一个修饰后名称(decorated name)。编译器在将C++源代码编译成目标文件时,会将函数和变量的名

田一一 2269

C++类模板本质:编译期类型工厂与实例化机制解析

C++泛型编程的核心在于类模板——它并非语法糖或高级宏,而是编译期运行的类型构造器。其原理基于延迟实例化、依赖名称查找(ADL)和SFINAE等机制,在编译阶段为每个具体类型生成独立、零开销的特化代码。这种机制赋予C++强类型安全、内存布局可控、无运行时开销的技术价值,广泛应用于嵌入式系统、高频交易、传感器融合等对性能与确定性要求严苛的工程场景。深入理解类模板的声明-定义-实例化三阶段分离,是突破模板误用、编译错误频发与二进制膨胀等实战瓶颈的关键路径。

cuankuangzhong6373的博客 486

必须知道的C语言知识细节:声明和定义

C语言中的声明(declaration)和定义(definition)是两个容易混淆的概念。 声明只是给变量、函数、结构体、联合体命名,表明程序有该变量、函数、结构体、联合体。 定义是具体给变量分配存储空间、给出函数的具体实现、指明结构体和联合体成员。 简单理解:如果程序中仅仅有声明,缺少定义实现,最终无法生成可执行的程序,因为信息不完整,无法完成编译全过程。 C语言中声明和定义的原则是: 声明可以出现多次,定义有且只能出现一次。 定义必须有,且只能出现一次。 声明和定义可以同时出现。 声明和定义可以分为以

qq_43351159的博客 1665

Frontline 15蓝牙协议分析工具深度安装与实战指南

蓝牙协议分析是BLE设备开发与故障定位的核心能力,涉及HCI层交互、ATT/GATT语义解析及物理层时序校准等关键技术。理解蓝牙5.4协议栈结构、掌握抓包工具的硬件协同机制(如Ubertooth/nRF52840探针)、实现协议栈状态机可视化与时间轴对齐,是提升IoT产品调试效率的关键路径。Frontline 15通过codex插件化架构支持动态协议规则扩展,并深度集成Python自动化脚本与Git固件管理,显著增强对BLE连接异常、配对失败、MTU协商超时等高频问题的根因定位能力。本文围绕其真实工程部署场

weixin_33795093的博客 403

BitLocker恢复密钥丢失?从原理到实战的完整解锁与系统重生指南

磁盘加密技术是数据安全的核心防线,它通过对存储设备上的数据进行编码,确保未经授权的用户无法访问。其原理主要基于加密算法(如AES)与密钥管理机制,在操作系统启动前或数据读写时进行实时加解密。这项技术的核心价值在于防止设备丢失或被盗后的数据泄露,尤其对于笔记本电脑和移动设备至关重要。典型的应用场景包括企业办公电脑、存有敏感信息的个人设备以及符合合规性要求的行业。当使用Windows系统自带的BitLocker加密功能时,若因硬件改动、系统更新等触发保护机制,用户可能会面临需要输入恢复密钥才能启动的困境。本文聚

weixin_34006965的博客 489

C语言常见英语词汇

运算符与表达式: 1.constant 常量 2. variable 变量 3. identify 标识符 4. keywords 关键字 5. sign 符号 6. operator 运算符 7. statement 语句 8. syntax 语法 9. expression 表达式 10. initialition 初始化 11. number format 数据格式 12 declaration 说明 13. type conversion 类型转换 14.define 、

B85951005的博客 8777

升降机SEW MOVIDRIVE变频器设置

选择PO1 第2,3,9,13 位,点击“SendPA”Start reference,编码器反馈值为0(PI2/3 Actual position=0)提示:传送参考位置前请断开变频器安全24V电源,否则会弹出禁止修改提示框;提示:做这一步时,如果出现电机不能转动,或产生报警不能通过编码器匹配。下载配置的参数,提示:下载参数需要断开变频器的安全24V电源。编码器匹配通过后点击下一步,进入下图画面传送参考位置。1电机不能转动:a可能是由于变频器的安全24V未给。点击2.SEW总线扩展定位,定位块设置。

xdpcxq的专栏 5397

定义与声明的语法规则及其意义上的根本区别(C++)

定义提供了具体的实现和内存分配,而声明只提供名称和类型信息。在程序中,定义和声明具有不同的作用,根据需要选择合适的方式来使用它们。

Kegi_的博客 901

【正点原子I.MX6U-MINI移植篇】Ubuntu-base根文件系统移植构建过程详解(四)

能不能在ARM板上运行Ubuntu呢?答案肯定是可以的,Ubuntu是Linux系统的一种,可以简单的将Ubuntu理解为一个根文件系统,和我们用busybox、buildroot制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上。

果果小师弟的博客 3767

嵌入式工程师成长之路(7)——算法学习

算法大全1、风仲达——算法笔记2、坐在马桶上学算法3、啊哈算法4、深度强化学习实验室。

云轩阁 4万+

node-sass 中 libsass C API 自定义函数实战:签名、fallback 处理器与 @debug/@error 重载

本文以 [sass-functions 接口文档](https://link.gitcode.com/i/4b565272314663724ccc83c79082a199) 为主体,完整讲解 libsass C API 中自定义函数(Sass Function)的声明方式、特殊签名(`*`、`@warn`、`@error`、`@debug`)、全部相关 API 函数以及内存管理约定,并结合 [sa

gitblog_00537的博客 923

基于FPGA的数字信号处理(11)--定点数的舍入模式(2)向最临近值取整nearest

基于FPGA的数字信号处理(11)--定点数的舍入模式(2)向最临近值取整nearest

孤独的单刀 5475

VSCode配置C/C++自动生成头文件:基于libclang的工程实践

在C/C++开发中,头文件作为模块间的接口契约,其一致性对编译和链接至关重要。传统手动维护头文件的方式在接口频繁变更时极易出错,导致编译失败或运行时Bug。通过自动化工具从源文件提取声明并同步到头文件,能从根本上保证接口一致性,提升代码质量与开发效率。这一过程通常依赖抽象语法树(AST)进行精准解析,libclang作为Clang编译器的Python绑定,提供了工业级的解析能力,能正确处理宏、模板等复杂语法。结合VSCode的任务系统与扩展生态,开发者可以构建一套在保存源文件时自动触发、基于AST分析的头文

weixin_34007886的博客 327

Android 10.0 SystemUI 屏蔽状态栏消息推送弹出的悬浮通知

在状态栏中,有一些通知类似 消息推送 弹出的 悬浮通知,弹出30秒之后会消失掉 要想屏蔽掉这些通知,首选知道这些通知是怎么产生的 通知类型 NotificationContentInflater.java 详细的介绍各种通知的类型 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java /** * The defau

安卓兼职framework和app工程师的博客 1542

ArcGIS笔记13_利用ArcGIS制作岸线与水深地形数据?建立水动力模型之前的数据收集与处理?

在利用MIKE建立水动力模型之前,需要收集、处理和制作诸多数据和资料,主要有岸线数据、水深地形数据、开边界潮位驱动数据、风场数据、潮位和海流观测资料和站点潮汐调和常数资料等。本篇主要介绍这些资料的获取与处理。

晏长街的博客 5948

C++函数本质:程序调度单元与栈帧生命周期

函数是C++程序运行时的最小调度单元,其核心原理在于编译器通过函数签名(返回类型+参数列表)进行唯一识别,并在每次调用时动态创建栈帧——完成参数压栈、控制权移交与内存边界隔离。这种机制赋予函数三大技术价值:实现逻辑责任划分、保障局部变量生命周期可控、支撑高效参数传递策略。广泛应用于算法实现(如快速幂、排序)、系统模块解耦(如计算器引擎)及现代特性构建(lambda、函数对象)。本文深入栈帧行为、签名匹配规则与传参陷阱,揭示函数作为C++程序‘呼吸节奏’的底层契约。

weixin_30263073的博客 304

FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇四

FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇四

坚韧与专注 2161

下完即切:用 downkyi 视频裁剪,只留下 B 站视频里你要的那 3 分钟

当你用 downkyi 下载 B 站视频时,可以直接在下载环节完成片段提取。内置的视频裁剪(Video Trimming)在下载阶段就能切出你需要的片段,省掉先下完整视频、再二次剪辑转码的中间环节,存储和时间都省下来。 ## 视频裁剪适合这些场景 - 网课复习,只需要保留 10 分钟例题讲解 - 二创剪辑,想留下某首歌的高光段落 - 素材库管理,把长视频拆成 10 秒以内的短片段 在这些场景

gitblog_00532的博客 197

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

The Concise TypeScript Book 深入解析:探索类型系统的结构、比较规则与推断机制

> 本文基于开源项目 [The Concise TypeScript Book](https://link.gitcode.com/i/a8e31c278ea3f3cd9034c4e84e14ddea) 的「Exploring the Type System」章节(含 [葡萄牙语译本](https://link.gitcode.com/i/78f117ad2db67f4e68731d5d615f3

gitblog_00261的博客 405

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

CodeGraph Rust 内核移植实战:Lua 与 Luau 的 bug-for-bug 等价迁移全解

CodeGraph 的 Rust 提取内核要把 TS 侧基于 WebAssembly 的 tree-sitter 提取器逐语言移植成原生 Rust walker,`docs/design/lua-luau-kernel-port-checklist.md` 是其中 Lua + Luau(R7b batch 4)合并移植的"bug-for-bug 清单":它记录了每个 TS 分支会命中什么、哪些怪癖

gitblog_00581的博客 353

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Flow-Typed 深度解析:为 Flow 构建版本化、可测试的社区 libdef 生态

本文围绕 Flow 官方博客《Introducing Flow-Typed》的核心内容,系统讲解 flow-typed 项目——一个社区驱动的 Flow 库定义(libdef)仓库与配套 CLI 工具。你将理解 libdef 对 Flow 类型体验的关键作用、flow-typed 的四条设计目标(版本化、高质量、持续贡献、自动化管理)、`flow-typed install` / `flow-ty

gitblog_00131的博客 831

代码对话层:构建可追问、带记忆的本地化代码理解系统

在软件工程中,'代码理解'是影响开发效率与系统可维护性的核心基础能力。其本质并非单纯阅读文本,而是基于语法结构、依赖关系、变更历史和语义模式的多维认知建模。传统大模型全文索引方案因信息密度不均、结构化线索缺失及历史意图隐匿而失效;真正可行的技术路径是分层索引——将AST解析、调用图谱、Git变更知识与规则化语义沉淀解耦为四层本地化索引体系,并通过光标锚定、证据溯源与自然语言查询解析实现高可信度对话交互。该范式显著降低遗留系统认知摩擦,支撑微服务多语言协同场景下的安全重构与精准排障,正成为现代IDE不可或缺的

weixin_34008805的博客 388

CodeGraph PHP 内核移植实战:从 wasm 提取器到 Rust 原生 Walkers 的 bug-for-bug 行为一致性

本文基于 CodeGraph 仓库中的移植设计文档 [php-kernel-port-checklist.md](https://link.gitcode.com/i/7f3e40d07834f70af7e3d69e45182693)(状态:PORT COMPLETE,2026-07-20)展开。它将回答一个非常具体的工程问题:当 CodeGraph 把 PHP 文件的符号提取从 TypeScri

gitblog_00601的博客 613

7 天 2600 Star:magpie 如何让任意 AI 编程工具随便换模型

同时开着 Claude Code、Codex 和 Gemini CLI,想给其中一个换个便宜模型?先翻它的配置文件,确认字段名和格式,改完重启,再祈祷没把别的设置弄坏。三个工具三套格式,改错一个字母直接罢工。magpie 把这套流程压缩成一个动作:菜单栏点一下,从一张列表里挑模型,剩下的它来改。上线 7 天,Star 数冲过 **2600**——这个藏在菜单栏里的小图标,到底做对了什么? ##

gitblog_00006的博客 262

OpenFrame OSS Frontend部署实战:Docker镜像与静态导出双目标构建发布完整指南

**OpenFrame OSS Frontend** 是 OpenFrame 平台的核心 Web 应用,一个面向 MSP(托管服务商)的 AI 驱动运维控制台,集成了设备管理、工单、监控、脚本与 AI 助手等功能。它基于 **Next.js 16** 构建,最大的亮点是:同一份代码库可以同时产出 **Docker 镜像**(用于 Web 服务器部署)和 **静态导出包**(用于打包进 Tauri

gitblog_00442的博客 193
上一篇: C语言中Static关键字的用法
下一篇: ldconfig用法
艺途心语
博客等级 码龄9年 16粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值