首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux c extern

extern 是 C 语言中的一个关键字,用于声明变量或函数是在其他地方定义的,而不是在当前文件中。这允许在一个文件中使用在另一个文件中定义的全局变量或函数。

基础概念

当你在 C 语言中使用 extern 关键字声明一个变量或函数时,你告诉编译器这个变量或函数的定义在其他地方。这样,编译器就不会为这个变量或函数分配内存,而是在链接阶段寻找其定义。

相关优势

  • 模块化extern 允许程序员将代码分割成多个文件,每个文件可以独立编译,然后通过链接器组合在一起。
  • 代码重用:通过 extern,可以在多个文件中共享全局变量或函数,避免重复定义。
  • 维护性:代码结构更清晰,便于维护和更新。

类型

extern 可以用于声明全局变量和函数。

全局变量

在头文件中声明全局变量:

代码语言:txt
复制
// global.h
#ifndef GLOBAL_H
#define GLOBAL_H

extern int globalVar;

#endif // GLOBAL_H

在一个源文件中定义全局变量:

代码语言:txt
复制
// global.c
#include "global.h"

int globalVar = 0;

在其他源文件中使用全局变量:

代码语言:txt
复制
// main.c
#include <stdio.h>
#include "global.h"

int main() {
    printf("Global variable: %d
", globalVar);
    return 0;
}

函数

在头文件中声明函数:

代码语言:txt
复制
// functions.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_H

extern void myFunction();

#endif // FUNCTIONS_H

在一个源文件中定义函数:

代码语言:txt
复制
// functions.c
#include <stdio.h>
#include "functions.h"

void myFunction() {
    printf("Hello from myFunction!
");
}

在其他源文件中使用函数:

代码语言:txt
复制
// main.c
#include <stdio.h>
#include "functions.h"

int main() {
    myFunction();
    return 0;
}

应用场景

  • 多文件项目:当项目包含多个源文件时,使用 extern 来共享全局变量和函数。
  • 库的使用:当使用外部库时,库的头文件通常会使用 extern 来声明库提供的函数和变量。

遇到的问题及解决方法

问题:重复定义

如果在多个源文件中定义了相同的全局变量,链接器会报重复定义错误。

解决方法:只在其中一个源文件中定义全局变量,在其他文件中使用 extern 声明。

问题:未定义引用

如果在头文件中声明了 extern 变量或函数,但没有在任何源文件中定义,链接器会报未定义引用错误。

解决方法:确保在某个源文件中对 extern 声明的变量或函数进行了定义。

问题:命名冲突

全局变量或函数的命名可能会与其他库或代码中的命名冲突。

解决方法:使用命名空间或前缀来避免命名冲突,或者将全局变量和函数封装在结构体或类中(在 C++ 中)。

总结

extern 关键字在 C 语言中用于跨文件共享全局变量和函数。正确使用 extern 可以提高代码的模块化和可维护性,但需要注意避免重复定义和未定义引用的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C和C++混合编译,extern和extern C

被extern “C”修饰的函数或者变量是按照C语言方式编译和链接的,所以可以用一句话来概括extern “C”的真实目的:实现C++与C的混合编程。...extern “C”的惯用法:  (1) 在C++中引用C语言中的函数和变量,在包含C语言头文件时(假设为cExample.h),需进行以下处理:  extern "C" { #include..."cExample.h"; }   而在C语言的头文件中,对其外部函数只能指定为extern,C语言中不支持extern “C”,会报编译错误。   ...extern “C”。...(2) C中引用C++语言中的函数或者变量时,C++的头文件需要加上extern “C”,但是C语言中不能直接引用声明了extern “C”的该头文件,应该仅在C中将C++中定义的extern “C”函数声明为

3.6K11
  • C++extern声明的外部变量 | 使用extern输出

    C++外部变量 上一节有读者咨询extern是什么,这节主要用来解释一下extern在C++中的用法,外部变量在函数的外部定义的,它的作用域为从变量的定义处开始,到本程序文件的末尾。...编译时将全局变量分配在静态存储区,有时需要用extern来声明全局变量,以扩展全局变量的作用域。 C++文件内声明全局变量  如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。...用extern扩展全局变量的作用域,虽然能为C++编码带来方便,但应十分慎重,因为在执行一个文件中的函数时,可能会改变了该全局变量的值,从而会影响到另一文件中的函数执行结果。...经典案例:C++实现用extern对外部变量作引用声明。...C++使用extern输出 更多案例可以go公众号:C语言入门到精通

    2.7K2828

    extern C的作用

    这个方法,细心的朋友会发现有一行extern "C",那这个有什么作用呢,能不能删除?...env->NewStringUTF(hello.c_str()); } 删除extern "C" 实践是检验真理的最好手段,我们删除一下extern "C"试试,虽然编译通过了,但是程序运行出现了闪退...extern "C"的作用到底是什么呢?...4.动态注册的JNI接口,就不用担心这个问题,所以不用加extern "C" 进一步思考 很多时候我们会碰到一些头文件中声明了C语言的函数,但是这个头文件会被C语言或者C++语言使用。...但是在C++语言中就会将memset函数修饰成_Z6memsetPvii, 这样子链接器就无法与C库中的memset的链接了,所以必须使用extern "C",但是C语言又不支持extern "C",如果为了兼容

    71730

    __cplusplus、extern “C”关键字

    我们在阅读程序时,经常会见到__cplusplus关键字,比如下面的代码: #ifdef __cplusplus extern "C" { #endif void *memset(void* ,int..., size_t); #ifdef __cplusplus } #endif 这里面,两种关键字,都是为了实现C++与C兼容的,extern “C”是用来在C++程序中声明或定义一个C的符号...,比如: extern “C” { int func(int); int var; } 上面的代码,C++编译器会将在extern “C”的大括号内部的代码当做C语言来处理...由于C和C++毕竟是不同的,为了实现某个程序在C和C++中都是兼容的,如果定义两套头文件,未免太过麻烦,所以就有了__cplusplus的出现,这个是在C++中特有的,__cplusplus其实就是C+...+,也就有了上面第一段代码的使用,如果这段代码是在C++文件中出现,那么经过编译后,该段代码就变成了: /**********C++文件中条件编译后结果***************/ extern "

    39220

    详细剖析 extern C

    但此时,如果你重新编译my_handle.c,C语言编译器将会报告“语法错误”,因为extern"C"是C++的语法,C语言编译器不认识它。...修改后的my_handle.h的代码如下: 小心门后的未知世界 在我们清楚了 extern "C" 的来历和用途之后,回到我们本来的话题上,为什么不能把#include 指令放置在 extern "C"...: 正如你看到的,当你把#include指令放置在extern "C" { }里的时候,则会造成extern "C" { } 的嵌套。...所以,严格的讲,你只应该把这三种对象放置于extern "C"的内部。 但,你把C语言的其它元素,比如非函数类型定义(结构体,枚举等)放入extern "C"内部,也不会带来任何影响。...某些人可能会建议你,如果a.h没有extern "C",而b.cpp包含了a.h,可以在b.cpp里加上 : extern "C" {   #include "a.h" } 这是一个邪恶的方案,原因在之前我们已经阐述

    1.4K30

    【C语言笔记】extern关键字

    extern声明变量 示例程序: test.h如下: //声明 extern int a; extern int b; test.c如下: #include "test.h" //定义 int a =...("a = %d , b = %d\n", a, b); return 0; } 其中,a,b的声明也可放在main.c中,代码如下: #include extern int...//extern关键字可要可不要 test.c如下: #include "test.h" //定义 int a = 520; int b = 1314; int add(int a, int b)...extern “C” extern “C”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。...因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern “C”就是其中的一个策略。

    1.1K30

    【C语言】extern 关键字

    创作者~周榜109﹣总榜883⇿全网访问量35w+ 本文由 謓泽 原创 CSDN首发如需转载还请通知⚠ 个人主页-謓泽的博客_CSDN博客  欢迎各位→点赞 + 收藏⭐️ + 留言​ 系列专栏-【C语言...】关键字_謓泽的博客 ✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本 ⑩② extern ⇿ 外部声明 ⒈描述⇢extern 变量称之为外部存储变量。...test.c 文件 #define _CRT_SECURE_NO_WARNINGS 1 #include extern Add(int x, int y); int main(void...{ int x = 20; int y = 30; int ret = Add(x, y); printf("ret = %d\n", ret); return 0; } Add.c文件...拓展⇢一般来说用包括的是C语言当中的头文件或者是库函数当中的头文件," "是自己使用自己所自定义的头文件[约定俗称的规矩],实际上.c源文件,我们只需要在.h头文件当中加上去就可以了。

    67810

    面试题:C++ extern作用?

    面试题:C++ extern作用? 在C++中,关键字extern可以用于声明变量或者函数是在别处定义的。...简单来说,关键字extern用来告诉编译器一个名称的实际位置详细信息,以便在其他文件中使用该变量或函数。 使用场景 如果在多个源文件中使用同一全局变量或函数,则需要使用extern关键字来进行声明。...注意事项 以下是使用extern关键字的几点注意事项: 在变量定义和使用的地方都可以加上extern关键字,但只有在变量定义前面加上extern才表示变量对其他文件是可见的。...如果在一个文件中定义并初始化了一个全局变量,同时在另一个文件中使用该全局变量时不需要extern声明。因为全局变量的定义已经包含了extern的语义。...综上所述,关键字extern用于告诉编译器一个名称的实际位置详细信息,以便在其他文件中使用该变量或函数,常用于多文件的项目中或库的开发中。

    3800

    【编程基础】extern C的用法解析

    3.深层揭密extern "C"   extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。让我们来详细解读这两重含义。   ...被extern "C"修饰的变量和函数是按照C语言方式编译和连接的;   未加extern “C”声明时的编译方式   首先看看C++中对类似C的函数是怎样编译的。   ...明白了C++中extern "C"的设立动机,我们下面来具体分析extern "C"通常的使用技巧。..." }   而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误。   ...(2)在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅将C文件中将C++中定义的extern "C"

    1K30

    【C语言】extern 关键字详解

    C语言 extern 关键字详解extern 关键字在C语言中用于声明一个变量或函数是定义在其他文件中的。它常用于跨文件共享数据和函数声明。...1.2 函数声明与定义声明:函数的声明也可以使用 extern 关键字,尽管在C语言中函数默认是 extern 的。...2. extern 的实际应用2.1 跨文件共享全局变量假设我们有两个文件:file1.c 和 file2.c,并希望在这两个文件之间共享一个全局变量。...总结extern 关键字在C语言中用于跨文件共享变量和函数的声明。它允许你在一个文件中声明变量或函数,而在其他文件中定义和使用它们。理解 extern 的使用可以帮助你组织和管理大型项目的代码。5....结束语本节内容已经全部介绍完毕,希望通过这篇文章,大家对C语言关键字 extern 有了更深入的理解和认识。

    21810

    extern C 关键字的作用

    在 C 语言中, extern 关键字具有外延性,使修饰的变量作用域可以拓展到其他文件中。而在C++中,extren被重载后有了其他功能,就是修饰函数以什么方式进行编译。...+编译器不对函数进行倾轧,可以使用 extern “C” 关键字,让其使用C语言的方式导出函数。...#include // 使用 C++ 编译器编译后的dll导出的所有函数都会倾轧 // 增加 extern “C” 关键字 extern “C” { _declspec(dllexport...可以增加一个判断,如果是C++文件就增加extern “C” 关键字,如果不是就不加,这样就可以非常灵活的使用 extren “C” 关键字了。...实现如下: #include // 使用 C++ 编译器编译后的dll导出的所有函数都会倾轧 // 增加 extern “C” 关键字 #ifdef __cplusplus extern “

    21220

    C++ 中 extern 数组和指针

    在一次使用 extern 声明全局变量的过程中,因为数组和指针的混用引发了错误。 我们知道,C++ 中使用 extern 来声明在其他(未使用 include 包含的)文件中的全局变量。...### extern 的问题 知道了上述的区别,再来看 `extern` 声明全局变量的内部实现: > 被 extern 修饰的全局变量不被分配空间,而是在链接的时候到别的文件中通过查找索引定位该全局变量的地址...这里问题就出现了:由于在这个文件中声明的 a 是一个指针变量而不是数组,链接器的行为实际上是把指针 a 自身的地址定位到了另一个 .c 文件中定义的数组首地址之上,而不是我们所希望的把数组的首地址赋予指针...补充 extern 知识 另外补充一些 extern 知识 extern "C":按照 C 语言的标准编译代码,主要是符号不同。...extern int i = 0;:定义,extern 可以省略,i 可以在其他文件中使用。 extern int i;:声明,i 在其他文件中定义。 int i:定义,分配了空间但未初始化。

    46200

    【面试宝典】c调用c++函数,为什么要加extern c

    首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。...),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的,来看看C++中对C的函数是怎样编译的: 作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。...加extern "C"声明后的编译和连接方式 加extern "C"声明后,模块A的头文件变为: // 模块A头文件 moduleA.h #ifndef MODULE_A_H #define MODULE_A_H...如果在模块A中函数声明了foo为extern "C"类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。...所以,可以用一句话概括extern “C”这个声明的真实目的(任何语言中的任何语法特性的诞生都不是随意而为的,来源于真实世界的需求驱动。

    1.9K140
    领券