为何头文件声明时加extern定义时不要加

在编程过程中,我们经常会遇到头文件和extern关键字的使用,头文件是C/C++程序中用来声明函数、变量和类等信息的文本文件,而extern关键字则用于声明一个变量或函数是在其他文件中定义的,为什么在头文件声明时要加extern,而在定义时不要加呢?本文将详细解析这个问题,并通过实例来说明。

头文件中的extern声明

在头文件中,我们通常会使用extern关键字来声明一个变量或函数是在其他文件中定义的,这样做的目的是为了告诉编译器这个变量或函数的定义在其他地方,以便在链接阶段将其与当前文件中的代码关联起来。

为何头文件声明时加extern定义时不要加

// file1.h
ifndef FILE1_H
define FILE1_H
int global_var; // extern declaration
void global_function(); // extern declaration
endif // FILE1_H

在这个例子中,我们在file1.h头文件中声明了两个全局变量和一个全局函数,注意,这两个全局变量和函数前面都加了extern关键字,这是因为它们的作用域不仅仅局限于file1.h文件,而是在整个项目中。

头文件中的extern定义

当我们在某个源文件(如file1.c)中对这些全局变量和函数进行定义时,我们需要去掉extern关键字,因为此时我们已经明确了它们的作用域仅限于file1.c文件。

// file1.c
include "file1.h"
int global_var = 42; // definition without extern keyword
void global_function() {
    printf("Hello, world!
");
}

在这个例子中,我们在file1.c文件中对global_var和global_function进行了定义,注意,这里我们去掉了extern关键字,这是因为我们已经明确了它们的作用域仅限于file1.c文件,如果我们不去掉extern关键字,编译器会在链接阶段报错,提示找不到这些全局变量和函数的定义。

通过上面的分析,我们可以得出结论:在头文件中声明全局变量和函数时,需要加上extern关键字,以表示它们的作用域在整个项目中,而在源文件中对这些全局变量和函数进行定义时,需要去掉extern关键字,以表示它们的作用域仅限于当前源文件,这样可以确保编译器在链接阶段能够正确地找到这些全局变量和函数的定义。

为何头文件声明时加extern定义时不要加

相关问题与解答

1、为什么需要将全局变量和函数放在头文件中声明?

答:将全局变量和函数放在头文件中声明的好处是可以实现代码的重用,当其他源文件需要使用这些全局变量和函数时,只需要包含对应的头文件即可,无需重复编写代码,头文件还可以包含常量、宏定义等信息,提高代码的可读性和可维护性。

2、将全局变量和函数放在头文件中声明有什么缺点?

答:将全局变量和函数放在头文件中声明的一个缺点是可能导致多个源文件之间的命名冲突,因为所有包含该头文件的源文件都可以访问到这些全局变量和函数,如果它们的名称相同,就会出现问题,为了避免这种情况,可以使用前向声明的方式将它们的作用域限制在当前源文件内。

为何头文件声明时加extern定义时不要加

3、在源文件中对全局变量和函数进行定义时,为什么要去掉extern关键字?

答:去掉extern关键字的原因是我们已经明确了它们的作用域仅限于当前源文件,如果我们不去掉extern关键字,编译器会在链接阶段报错,提示找不到这些全局变量和函数的定义,这样会导致链接失败,无法生成可执行文件或库文件。

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/129560.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2023-12-15 14:17
Next 2023-12-15 14:20

相关推荐

  • Python怎么做函数声明

    在Python中,函数是一段具有特定功能的、可重用的代码,通过定义函数,我们可以将代码模块化,提高代码的可读性和可维护性,本文将详细介绍如何在Python中进行函数声明。函数的基本概念1、函数定义:使用def关键字定义一个函数,后面跟函数名和圆括号,圆括号内为参数列表,最后以冒号结尾。2、函数体:缩进的代码块,用于实现函数的功能。3、……

    2023-12-29
    0130
  • c 声明 定义

    类的方法声明在C语言中,类是一种用户自定义的数据类型,它可以包含数据成员和成员函数,成员函数是类的特殊成员,它们用于操作类的数据成员,在C语言中,我们可以使用函数原型来声明类的方法,函数原型包括函数的返回类型、函数名和参数列表,下面是一个简单的示例:include <stdio.h>// 定义一个名为Per……

    行业资讯 2024-02-17
    0110
  • javascript中的关键字有哪些

    JavaScript是一种高级的、解释型的编程语言,它的关键字是一种特殊的标识符,用于表示语言的固有结构和语义,在JavaScript中,关键字具有特殊的语法含义,不能用作变量名、函数名或方法名等,本文将介绍JavaScript中的关键字及其作用。数据类型关键字1、Boolean:布尔值,表示真或假。2、Null:表示空值,即没有任何……

    2024-01-04
    0197
  • c语言全局变量如何定义

    C语言全局变量的定义在C语言中,全局变量是在程序的整个生命周期内都可以访问的变量,它们通常用于存储在整个程序中都需要使用的数据,全局变量的定义和使用需要遵循一定的规则,本文将详细介绍如何在C语言中定义全局变量。1、全局变量的定义在C语言中,全局变量的定义通常放在源文件的开头,使用extern关键字进行声明。extern关键字表示该变量……

    2023-12-27
    0559
  • 变量存储_管理变量

    管理变量是指对程序中使用的变量进行有效管理和控制,包括声明、初始化、作用域和生命周期等方面。

    2024-06-09
    0127
  • c语言主函数如何调用子函数的变量

    在C语言中,主函数是程序的入口点,而子函数则是在主函数或其他函数内部定义的函数,主函数可以调用子函数来实现特定的功能,下面是关于如何在C语言主函数中调用子函数的详细介绍:1、子函数的定义和声明 在C语言中,子函数的定义通常放在主函数之前或之后,但必须在使用之前进行声明,声明子函数的目的是告诉编译器子函数的名称、返回类型以及参数列表,声……

    2024-02-27
    0247

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入