【C语言】声明与定义的区别

这篇具有很好参考价值的文章主要介绍了【C语言】声明与定义的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

        声明和定义是C语言中非常重要的概念,它们在程序设计中都有各自独特的作用。声明不分配存储空间,定义分配存储空间,初始化时往往是声明和定义同时存在。本文主要通过介绍声明与定义的基本定义以及分析两者的区别和大量代码案例。

1.声明和定义的定义

        声明和定义是C语言中两个不同的概念。在C语言中,声明主要指在程序中提前说明某个标识符(变量、函数等)的数据类型及名称,而不分配实际的存储空间;定义则指在程序中为变量或函数赋予存储空间,并进行初始化

例如:

// 声明变量a和函数max,分别表示a是一个int类型的变量,max是一个求两个参数最大值的函数
int a;
int max(int x, int y);

// 定义变量a,分配了4字节的空间,初始值为0
int a = 0;

// 定义函数max,分配代码区域的空间并初始化函数代码
int max(int x, int y) {
    return x > y ? x : y;
}

        在上面的代码中,前两行是变量和函数的声明,第三行是变量的定义,第四至六行是函数的定义。

2. 声明和定义的使用场景

        在C语言中,声明和定义都有各自独特的用途,常见的使用场景包括以下几个方面。

2.1 声明变量或函数

        在程序中,如果需要使用某个变量或函数,可以提前进行声明。例如:

// 声明变量sum和函数quick_sort
int sum;
void quick_sort(int* nums, int n);

        这样,即使在变量或函数定义的实现代码还没有出现之前,其他函数或代码也可以通过声明来使用这些标识符。这在程序分离编译时尤为重要。

2.2 外部变量

        在多个源文件之间共享变量时,可以在一个源文件中定义该变量,同时在其他文件中通过声明方式引用该变量。这种变量被称为 “外部变量”。

// file1.c

int count = 0; // 在一个源文件中定义count变量

// file2.c

extern int count; // 引用变量count,表示该变量在其他源文件中已被定义

int main() {
    printf("count = %d", count);
    return 0;
}

        此时,编译器会将两个源文件分别编译生成目标文件,并在链接时将它们合并成一个可执行文件。此时,变量 count 就被视为一个全局变量。

2.3 函数声明

        在C语言中,一个函数可以在另一个函数之前定义,但不能在另外一个函数之前调用。因此,如果需要在函数前面调用另一个未定义的函数,就需要提前进行函数的声明。

// 函数声明
int max(int x, int y);

// 在另一个函数中调用max函数
int main() {
    int a = 5, b = 10;
    int c = max(a, b); // 调用max函数
    printf("max = %d", c);
    return 0;
}

// 实现max函数
int max(int x, int y) {
    return x > y ? x : y;
}

        在上面的代码中,为保证 main() 函数能够正常调用 max() 函数,需要进行函数的声明。

2.4 头文件

        在每个源文件中,相同的结构体定义、函数原型和全局变量定义通常是重复的,这样会导致代码冗余和编译时间的延长。因此,可以把这些重复性的定义抽出来放到一个头文件中,以实现代码的复用。

        例如,将上面的 max() 函数声明放入头文件中:

// max.h
#ifndef MAX_H // 如果没有定义 MAX_H,则执行下面的代码
#define MAX_H // 定义 MAX_H 宏

// 函数声明
int max(int x, int y);

#endif // 结束宏定义

        然后,在需要使用 max() 函数的源文件中,只需要包含头文件即可。

#include "max.h"

int main() {
    int a = 5, b = 10;
    int c = max(a, b); // 调用max函数
    printf("max = %d", c);
    return 0;
}

// 实现max函数
int max(int x, int y) {
    return x > y ? x : y;
}

        这样,就可以将 max() 函数的声明和实现代码分离,实现代码复用和提高编译效率。

3. 声明和定义的注意点

        在使用声明和定义时,还需要注意以下几个重要的点。

3.1 不要重复定义

        在同一个作用域内,一个变量或函数只能被定义一次,但可以被声明多次。因此,在使用声明和定义时,需要注意不要重复定义。

// 重复定义变量a
int a = 0;
int a = 1; // error:重复定义a

// 重复定义函数max
int max(int x, int y) {
    return x > y ? x : y;
}
int max(int x, int y) { // error:重复定义max
    return x < y ? x : y;
}

3.2 声明和定义的作用域

        在程序中,变量或函数的作用域取决于它们的声明和定义位置。

3.2.1 全局变量和函数

        全局变量和函数的声明和定义作用域为整个程序,在任何函数中均可访问。

// file1.c

int count = 0; // 在一个源文件中定义count变量

// file2.c

extern int count; // 引用变量count,表示该变量在其他源文件中已被定义

int main() {
    printf("count = %d", count);
    return 0;
}

3.2.2 局部变量和函数

        局部变量和函数的作用域仅限于定义它们的块内部,包括代码块、函数体、for循环等。

void f1() {
    
    int a; // 局部变量a在函数体内可见

    if (1) {
        int b; // 局部变量b在代码块内可见
    }

    for (int i = 0; i < 10; i++) {
        int c; // 局部变量c在for循环内可见
    }
}

void f2() {

    void f3() { // 函数f3仅在函数f2内可见
    }

    f3(); // 在函数f2中可以调用函数f3
}

3.3 函数声明和定义的差异

        在C语言中,函数的声明和定义还有一些差异,需要特别注意。

3.3.1 函数声明必须包含参数类型

        在声明函数时,必须包含参数列表和每个参数的类型。在定义函数时,参数列表可以为空。

// 函数声明时必须包含参数类型
int max(int x, int y); // 正确
int max(int, int);     // error: 名字重复

// 函数定义时可以省略参数名称
int max(int x, int y) { // 正确
    return x > y ? x : y;
}
int max(int, int) {      // error: 名字重复
    return x > y ? x : y;
}

3.3.2 函数声明和定义中的参数个数和类型必须一致。

        在函数声明和定义中,参数个数和类型必须一致。否则,程序会编译错误。

// 参数类型不一致
int max(int x, int y); // 函数声明
double max(int x, int y) { // error:函数定义中参数类型与函数声明不一致
    return x > y ? x : y;
}

// 参数个数不一致
int sum(int x, int y);
double sum(int x, int y, int z); // error:函数定义中参数个数与函数声明不一致

// 参数个数和类型一致
int max(int x, int y); // 函数声明
int max(int x, int y) { // 函数定义
return x > y ? x : y;
}

进一步示例

        为了更好地理解声明和定义在C语言中的使用,可以通过以下示例进行进一步学习。

示例1:

// 声明局部变量a和函数max
void max(int x, int y); 
int main() {
    int a = 5, b = 10;
    max(a, b); // 调用max函数
    return 0;
}

// 定义局部变量a和函数max
void max(int x, int y) {
    int a = 0; // 局部变量a在函数max内可见
    a = x > y ? x : y;
    printf("max = %d", a);
}

        在上面的代码中,定义了函数 max() 和局部变量 a。函数 max() 在主函数中通过声明进行调用并进行实现。此时,局部变量 a 仅在函数 max() 中可见。

示例2:

// 声明全局变量a和函数square
int a;
int square(int x);

int main() {
    
    a = 5; // 对全局变量a进行赋值

    int b = square(a); // 调用函数square
    printf("a = %d, b = %d", a, b);

    return 0;
}

// 定义函数square
int square(int x) {
    return x * x;
}

        在上面的代码中,全局变量 a 和函数 square() 在主函数前进行了声明。在主函数中,全局变量 a 被赋值为5,然后调用函数 square() 并传递参数 a。此时,函数 square() 使用参数 x 进行计算,并返回结果,同时全局变量 a 也被更新了它的值。

示例3:

// 声明全局变量count和函数add
extern int count;
int add(int a, int b);

int main() {

    count = 100; // 对全局变量count进行赋值

    int a = 5, b = 10;
    int c = add(a, b); // 调用函数add,并传递参数a和b
    printf("count = %d, c = %d", count, c);

    return 0;
}

// 定义全局变量count和函数add
int count = 0;
int add(int a, int b) {
    count++; // 对全局变量count进行自增操作
    return a + b;
}

        在上面的代码中,全局变量 count 和函数 add() 在主函数前进行了声明。在主函数中,全局变量 count 被赋值为100,然后调用函数 add() 并传递参数 a 和 b。此时,函数 add() 使用传递的参数进行计算,并将全局变量 count 进行自增操作。最后,函数 add() 返回计算结果,并在主函数中输出全局变量 count 和计算结果 c

总结:

        声明和定义是C语言中两个不同的概念,它们在程序设计中具有重要作用。声明可以提前说明某个标识符(变量、函数等)的数据类型及名称,而不分配实际的存储空间;定义则为变量或函数赋予存储空间,并进行初始化。在使用声明和定义时,需要注意不要重复定义;函数声明必须包含参数类型;参数个数和类型必须一致等问题。透彻理解声明和定义的原理和用法,对于C语言开发者来说是非常重要的。文章来源地址https://www.toymoban.com/news/detail-753070.html

到了这里,关于【C语言】声明与定义的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 鸿蒙Harmony应用开发—ArkTS声明式开发(自定义事件分发)

    ArkUI在处理触屏事件时,会在触屏事件触发前进行按压点和组件区域的触摸测试,来收集需要响应触屏事件的组件,再基于触摸测试结果分发相应的触屏事件。在父节点,开发者可以通过onChildTouchTest决定如何让子节点去做触摸测试,影响子组件的触摸测试,最终影响后续的触

    2024年04月14日
    浏览(43)
  • 【C语言13】结构体的声明,定义与结构体的内存对齐

    通俗的说,结构体就是一个类的集合,如同整形数组是整形数字的集合体,结构体也是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 如果我们要表达一本书,那么这本书的元素有什么呢,书的名字,书的作者,书的创作日期~,而c语言中内置

    2024年02月13日
    浏览(59)
  • HarmonyOS/OpenHarmony应用开发-ArkTS语言声明式UI描述

    ArkTS以声明方式组合和扩展组件来描述应用程序的UI,同时还提供了基本的属性、事件和子组件配置方法,帮助开发者实现应用交互逻辑。 一、创建组件 根据组件构造方法的不同,创建组件包含有参数和无参数两种方式。 说明,创建组件时不需要new运算符。 1.无参数 如果组

    2024年02月08日
    浏览(70)
  • HarmonyOS(二)—— 初识ArkTS开发语言(下)之ArkTS声明式语法和组件化基础

    通过前面ArkTS开发语言(上)之TypeScript入门以及ArkTS开发语言(中)之ArkTS的由来和演进俩文我们知道了ArkTS的由来以及演进,知道了ArkTS具备了声明式语法和组件化特性,今天,搭建一个可刷新的排行榜页面。在排行榜页面中,使用循环渲染控制语法来实现列表数据渲染,使

    2024年02月04日
    浏览(41)
  • Python中定义(声明)结构体

    前言 在Python中并无像C/C++那样的结构体类型,但是由于Python是用C编写而来的,很多东西可以互通。 Python是有struct模块,但并非是用于处理一般结构体的,并且使用起来也比较麻烦。 实现 我们可以使用Class类来实现一个在C/C++中呈现的结构体,也可以实现C/C++中 typedef struct {

    2024年02月15日
    浏览(78)
  • idea插件开发-自定义语言00-开发导航

     源码 Initial Setup(初始化设置) ​​Registering a File Type​​​ :注册文件类型要实现一个自定义的语言必须要实现的,​​示例代码​​ ​​Implementing Lexer实现​​ :实现编程语言的语法分析器,​​示例代码​​ ​​Implementing Parser and PSI​​​:实现一个词法分析器

    2024年02月12日
    浏览(26)
  • Vue宝典之自定义组件声明与使用

    Vue.js 是一款现代化的JavaScript框架,它的核心思想是组件化开发。通过使用Vue的自定义组件功能,我们可以将页面拆分为多个组件,每个组件负责自己的一部分功能。这样做的好处是,我们可以更好地管理和维护代码,使得项目结构更加清晰和可扩展。 自定义组件是Vue中用来

    2024年02月05日
    浏览(38)
  • 结构体声明、定义和初始化的几种方式

    五种结构体声明方式: 直接声明结构体类型 声明结构体类型的同时定义结构体变量 不指定结构体名而直接定义结构体变量 使用结构体标记和类型别名 直接声明结构体别名 在C语言中,标记(tag)是在定义struct, union或enum之后使用的标识符。 之所以称其为结构体的“

    2023年04月11日
    浏览(35)
  • 使用Redission自定义注解实现分布式锁(声明式)

    1.主要依赖 配置redission 自定义注解 sepl工具类 aop

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包