使用C语言自定义头文件,声明的变量或者函数用extern和不同extern修饰有什么区别?

在C语言中,当在头文件中声明变量或函数时,使用extern和不使用extern修饰有以下区别:

  1. 使用extern修饰变量:
    • extern修饰的变量只是声明,不分配存储空间。它表示该变量的定义在其他源文件中,需要在使用该变量的源文件中进行定义和分配存储空间。
    • 不使用extern修饰的变量则是定义,会分配存储空间。它表示该变量的定义和分配存储空间在当前源文件中。

例如,假设我们有一个名为globals.h的头文件,其中声明了一个全局变量:

// globals.h

extern int globalVariable;

如果在另一个源文件中包含该头文件并使用该全局变量,需要在该源文件中进行定义和分配存储空间:

// main.c

#include <stdio.h>
#include "globals.h"

int globalVariable; // 定义和分配存储空间

int main() {
    globalVariable = 10;
    printf("The value of globalVariable is: %d\n", globalVariable);
    return 0;
}
  1. 使用extern修饰函数:
    • extern修饰的函数只是声明,表示该函数的定义在其他源文件中,需要在使用该函数的源文件中进行定义。
    • 不使用extern修饰的函数则是定义,表示该函数的定义和实现在当前源文件中。

例如,假设我们有一个名为functions.h的头文件,其中声明了一个函数:

// functions.h

extern int add(int a, int b);

如果在另一个源文件中包含该头文件并调用该函数,需要在该源文件中进行函数的定义和实现:

// main.c

#include <stdio.h>
#include "functions.h"

int add(int a, int b) { // 函数的定义和实现
    return a + b;
}

int main() {
    int result = add(3, 5);
    printf("The result is: %d\n", result);
    return 0;
}

总结来说,使用extern修饰变量或函数的声明表示其定义在其他源文件中,需要在使用的源文件中进行定义和实现。不使用extern修饰的变量或函数则表示其定义和实现在当前源文件中。

注(Q):头文件中声明的函数的默认的存储类别是extern吗?

是的,头文件中声明的函数的默认存储类别是extern

在C语言中,函数的默认存储类别是extern,即使没有显式地使用extern关键字进行声明。这意味着,如果在头文件中声明一个函数,它会被默认视为是一个在其他源文件中定义的函数。

例如,假设我们有一个名为functions.h的头文件,其中声明了一个函数:

// functions.h

int add(int a, int b); // 默认存储类别为extern

然后,在另一个源文件中包含该头文件,并在该源文件中定义和实现该函数:

// main.c

#include <stdio.h>
#include "functions.h"

int add(int a, int b) { // 在当前源文件中定义和实现函数
    return a + b;
}

int main() {
    int result = add(3, 5);
    printf("The result is: %d\n", result);
    return 0;
}

在这个例子中,我们没有在函数声明中使用extern关键字,但是函数add仍然被视为是一个在其他源文件中定义的函数。这是因为在C语言中,函数的默认存储类别是extern

需要注意的是,对于全局变量来说,默认存储类别也是extern,但是对于局部变量来说,默认存储类别是auto。因此,在头文件中声明全局变量时,也可以省略extern关键字。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值