【C】为什么 C 标准说定义也是一种声明

news/2025/2/24 21:50:09

C 标准在声明章节中有这么一段话:

A declaration specifies the interpretation and properties of a set of identifiers. A definition of an
identifier is a declaration for that identifier that for:
— an object, causes storage to be reserved for that object,
— a function, includes the function body,122)
— an enumeration constant, is the first (or only) declaration of the identifier, or
— a typedef name, is the first (or only) declaration of the identifier.

C 语言标准中,定义(definition)被视为一种声明(declaration),是由于两者在语义上的关系。下面我们来详细解释一下这个概念。

声明与定义的关系

  1. 声明的意义

    • 声明的目的是告诉编译器某个标识符(如变量、函数、类型等)是存在的,并且描述该标识符的类型和其他相关属性。
    • 声明并不提供存储空间(对于变量)或者函数的实现。
  2. 定义的意义

    • 定义不仅声明了标识符的名字和类型,而且还为其分配存储空间(变量)或提供实现(函数)。
    • 每个定义都至少是一个声明,因为它还需要告知编译器该标识符的类型。

为什么定义也是声明

  • 语义层面:任何定义都是语法上有效的声明,因此在某种程度上,所有的定义都可以被视为声明。例如:

    int x;  // 这是 x 的定义,也是它的声明
    

    在这个例子中,int x; 不仅声明了 x 是一个整数类型,同时也定义了 x

  • 标准的规定:根据 C 语言标准(如 C99 和 C11),定义被视为一种特殊的声明。这意味着当定义一个变量或函数时,编译器会将其视为同时对该标识符进行声明。

例子

  1. 变量

    int x;      // 这是一个定义,也是一个声明
    extern int y; // 这是一个声明,但不是定义
    
  2. 函数

    int add(int a, int b) {
        return a + b; // 这是 add 函数的定义,也是声明
    }
    
    int add(int, int); // 这是一个函数的声明
    

小结

因此,C 标准将定义视为一种声明,是因为定义在本质上提供了声明的所有功能,并且因为它是构造程序所需的信息的一部分。通过这种方式,编译器能够理解程序的结构,即使这些信息是以定义的方式呈现出来的。


http://www.niftyadmin.cn/n/5864829.html

相关文章

跟着 Lua 5.1 官方参考文档学习 Lua (6)

文章目录 2.11 – Coroutines 2.11 – Coroutines Lua supports coroutines, also called collaborative multithreading. A coroutine in Lua represents an independent thread of execution. Unlike threads in multithread systems, however, a coroutine only suspends i…

(C源代码)全路径格式和树形视图格式之间来回转换的命令行工具

先举个例子,假如有6个txt文件 全路径格式 fp.txt (FullPath): C:\1.txt C:\1\21.txt C:\1\22.txt C:\1\2\31.txt C:\1\23.txt C:\2.txt 树形视图格式 tv.txt (TreeView): C: 1.txt 1 21.txt …

AI赋能的未来城市:如何用智能化提升生活质量?

这会是我们憧憬的未来城市吗? 随着技术的不断进步和城市化进程的加速,现代城市面临着诸多挑战——交通拥堵、环境污染、能源消耗、人口老龄化等问题愈发突出。为了应对这些挑战,建设智慧城市已成为全球发展的重要趋势。在这一进程中&#xf…

【代码软件 | vs2019】vs2019+Qt5.12.12开发环境 的下载、安装详细介绍

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

开源软件的版权保护措施

开源软件的版权保护措施主要有以下几方面: 著作权保护 明确版权归属与许可使用:开源软件的源代码是著作权法保护的对象,作者享有复制权、发行权、改编权等专有权益。通过开源协议,作者明确授权用户使用、复制和修改软件&#xf…

深入理解P2P网络架构与实现

P2P结构基础讲解大纲 P2P结构概述 P2P的定义与特点P2P与客户端-服务器结构的区别P2P的应用场景 P2P网络架构 去中心化与分布式节点与连接P2P通信协议网络拓扑优缺点分析 P2P协议与技术实现 介绍常见的P2P协议(如BitTorrent)P2P协议中的数据传输机制基于…

JS复习练习题目、完整nodejs项目以及Commons、Es

### JS复习练习 - ![20250220204925](/up-z0.qiniup.com20250220204925.png) 1. 任务1:创建一个简单的问候函数 - 编写一个函数greet,接受一个名字作为参数,并返回一个问候语,例如:“Hello, [名字]! Welcome to Jav…

代码审计初探

学会了基础的代码审计后,就该提高一下了,学一下一些框架的php代码审计 先从一些小众的、已知存在漏洞的cms入手 phpems php的一款开源考试系统 源码下载 https://down.chinaz.com/soft/34597.htm 环境部署 windows审计,把相关文件放到phps…