迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

C 语言中的 extern 关键字

作者:迹忆客 最近更新:2023/05/05 浏览次数:

本文将演示关于如何在 C 语言中使用 extern 关键字的多种方法。


C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

一般来说,C 语言的变量有 3 种不同的链接类型:外部链接、内部链接或无链接。如果一个变量定义在块或函数范围内,就认为它没有链接。一个具有文件作用域的变量可以有内部链接或外部链接。也就是说,如果一个全局变量用 static 限定符声明,它就具有内部链接,意味着该变量可以在一个源文件(更准确的说是翻译单元)中使用。没有 static 限定符的全局变量被认为具有外部链接,可以在不同的源文件中使用。如果要使用在其他源文件中定义的全局变量,应该使用关键字 extern 来声明。

#include <stdio.h>
#include <stdlib.h>

#ifndef COUNT
#define COUNT 10
#endif

extern int counter;

int main(void) {

    printf("counter: ");
    for (int i = 0; i < COUNT; ++i) {
        counter += 1;
        printf("%d, ", counter);
    }
    printf("\b\b \n");

    exit(EXIT_SUCCESS);
}

输出:

counter: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

extern 限定变量通常定义在不同文件的某个地方。不过,从技术上讲,我们还是可以在同一个文件中使用 extern 关键字来声明全局变量,如下例所示。这种类型的声明本质上是多余的,因为编译器会自动使变量名在同一文件范围内的任何地方可见。

#include <stdio.h>
#include <stdlib.h>

#ifndef COUNT
#define COUNT 10
#endif

int counter2 = 0;

int main(void) {

    extern int counter2; //redundant
    counter2 += 10;
    printf("%d\n", counter2);

    exit(EXIT_SUCCESS);
}

不过要注意,extern 声明的变量不应该被初始化,因为如果我们在一个源文件中定义 const char*全局变量,然后用一些字符串文字值初始化它,会导致编译器警告。在不同的源文件中声明同一个没有 const 修饰符的变量,在编译时不会出现警告,而且会删除对象的 const 性。因此,如果用户试图修改只读字符串 tmp,编译器不会抛出错误,但程序会遇到分段故障。

#include <stdio.h>
#include <stdlib.h>

#ifndef COUNT
#define COUNT 10
#endif

extern int counter;
//extern int counter = 3; // erroreous
extern char *tmp; // erroreous

int counter2 = 0;

int main(void) {

    printf("counter: ");
    for (int i = 0; i < COUNT; ++i) {
        counter += 1;
        printf("%d, ", counter);
    }
    printf("\b\b \n");

    tmp[0] = 'S'; // segmentation fault
    printf("%s", tmp);

    exit(EXIT_SUCCESS);
}

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

在 C 语言中使用位移操作

发布时间:2023/05/07 浏览次数:132 分类:C语言

本文演示了如何在 C 语言中使用位移操作。在 C 语言中使用 << 运算符将数字向左移位的方法

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便