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

C中是否需要函数的extern关键字?

在C语言中,extern关键字用于声明一个变量或函数是在其他文件中定义的。它的作用是告诉编译器该变量或函数的定义在其他地方,而不是当前文件中。

在C语言中,默认情况下,函数的声明是隐式的extern声明。也就是说,如果在一个文件中定义了一个函数,而在另一个文件中调用该函数,不需要使用extern关键字来声明函数。编译器会自动在调用函数的文件中查找函数的定义。

然而,如果你想在一个文件中使用另一个文件中定义的全局变量,就需要使用extern关键字来声明该变量。这样编译器就知道该变量是在其他文件中定义的,并且可以正确地链接它们。

需要注意的是,extern关键字只是用于声明变量或函数,而不是定义它们。变量或函数的定义通常在另一个文件中。

总结起来,C语言中使用extern关键字来声明在其他文件中定义的变量或函数,以便在当前文件中使用它们。

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

相关·内容

extern C 关键字的作用

在 C 语言中, extern 关键字具有外延性,使修饰的变量作用域可以拓展到其他文件中。而在C++中,extren被重载后有了其他功能,就是修饰函数以什么方式进行编译。...决定了在编译过程中是否对函数进行倾轧(Name Mangling)操作,也是在今天才知道倾轧这个词语。...#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关键字

C语言中的extern关键字 作用 在C语言中,extern关键字用于声明外部变量或函数。它通常用于在一个源文件中引用另一个源文件中定义的全局变量或函数。...下面是一个示例,展示了如何使用extern关键字来声明并引用外部变量: 在文件 file1.c 中定义全局变量 count: // file1.c int count = 10; 在文件 file2.c...总结而言,extern关键字用于在一个源文件中引用另一个源文件中定义的全局变量或函数。它允许您在一个源文件中声明外部变量或函数,并在另一个源文件中使用这些声明进行引用。...然后,在需要使用这些外部变量和函数的源文件中,通过 #include “myheader.h” 将头文件包含进来。...需要注意的是,头文件中应该只包含声明而不是定义。变量和函数的定义应该放在对应的源文件中。

62830
  • C++的extern关键字知识点

    第二,当extern不与"C"在一起修饰变量或函数时,如在头文件中: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用...4 问题:extern “C”   在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?   ...答案与分析:   C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C...函数声明   常常见extern放在函数的前面成为函数声明的一部分,那么,C语言的关键字extern在函数的声明中起什么作用?   ...答案与分析:   如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。

    1K40

    C 语言中 extern 关键字的用途及其实际应用

    extern 关键字是 C 语言中的一个重要特性,为程序员提供了跨文件访问全局变量或函数的能力,支持模块化编程和复杂项目的组织。理解 extern 的用途及其应用场景是编写高效和可维护代码的关键。...extern 的基本含义extern 关键字的作用是声明一个全局变量或函数,使其能够被其他文件引用,而不是在当前文件中重新定义它。...,file2.c 使用了 file1.c 中定义的变量和函数。...通过 extern 声明,file2.c 告诉编译器这些变量和函数的定义存在于另一个文件中,从而实现了跨文件访问。...例如,一个嵌入式系统的项目可能包括以下模块:硬件控制模块通信模块数据处理模块假设通信模块需要访问硬件控制模块中的全局变量 hardware_status,可以通过 extern 关键字实现:// hardware.cint

    14310

    C:关于static 和 extern 关键字的介绍-学习笔记

    本篇文章将介绍两个关键字 static 、extern的作用 1、作用域与生命周期 在介绍 static 和 extern之前,我们需要先了解:作用域与生命周期 1.1 作用域 作用域(scope)是程序设计概念...2、static 和 extern static 和 extern 都是C语⾔中的关键字。...2.2 static 修饰全局变量(包含extern的作用): 首先,我们现在add.c文件定义一个全局变量int g_val = 2024; 然后再xu.c中使用全局变量intg_val 结果展示:...从上面对比你知道extern的作用了吗? extern 是用来声明外部符号的,如果⼀个全局的符号在A文件中定义的,在B文件中想使用,就可以使用extern进行声明,然后使用。...结语: 本篇文章将告一段落,这篇文章主要讲了两个关键字static 和 extern的作用以及用法 同时还介绍了两个名词作用域与生命周期,在介绍static的用法中,使用了将代码放在多个文件的用法,明天会更新将代码拆分放在多个文件的操作

    11910

    c++模板:调用模板成员函数需不需要加template关键字?

    以下是个简单的模板类测试代码,模板类A中定义了模板函数hello,在模板函数test中调用A::hello template_test.cpp template struct A{...同样是模板成员函数,hello2因为调用时不需要指定显式模板参数,不加template关键字也可以被编译正确识别。...如下是C++标准中的说明(《14.2 Names of template specializations》): 当类的模板成员名称出现在 ....或 -> 在后缀表达式中,或在限定标识符中的嵌套名称说明符之后,并且后缀表达式或限定标识符显式依赖于模板参数(14.6.2),成员模板名称必须是以template关键字为前缀。...以下是从C++标准文档(《Working Draft, Standard for Programming Language C++》 )摘录的14.2原文 那么为什么MSVC就不需要tempate

    1K30

    4.C++中的函数重载,C++调用C代码,newdelete关键字,namespace(命名空间)

    本章主要内容: 1)函数重载 2)C++调用C代码 3)new/delete关键字实现动态内存分配 4)namespace命名空间 ---- 大家都知道,在生活中,动词和不同的名词搭配一起,意义都会大有不同...,参数不同,而意义却大有不同. 1.2那这些重载函数的入口地址是否相同 修改上面栗子的main()函数,如下图所示: ?...注意: 重载函数需要避免使用参数默认值 调用重载函数时,只会匹配函数参数表,与函数返回值无关 函数重载必须发生在同一个作用域中 重载函数的入口地址,不能直接通过函数名来获取 2.C++与C代码相互调用...当C++想调用C里的某个函数时,则使用extern “C” 还是举个栗子,通过C++调用C里面的add()函数 1) 首先创建3个文件 ?...free(p); } 从上面栗子,可以看到C是通过库函数完成内存分配的 3.2而在C++中,则通过new关键字进行内存申请,delete关键字进行内存释放,比如: ?

    85020

    C++中的explicit关键字

    1. explicit关键字 explicit的中文含义是显示的,在C++中主要用于防止隐式转换的发生。...:_value1: 2,在main函数中,demo = 2就发生了隐式转换,用户类的初始化。...如果加上explicit关键字又会是怎样,在Demo(int a)前面加上explicit,结果在编译的时候就显示“no known conversion for argument 1 from ‘int...构造函数 C++中的explicit关键字只能用于修饰只有一个参数或者多参数情况下,除了第一个参数外的其他参数都是默认值的构造函数中,对于无参或者除上述之外的多参数构造函数是无效的,如: class Demo...总结 C++中explicit关键字可以防止隐式转换的发生,在使用时注意如下几点: 只能用于修饰只有一个参数的类构造函数,或者修饰多参数情况下除第一个参数外其余参数都是默认值的构造函数中; 无参构造函数或者多参数构造函数总是显示调用

    59830

    C#中的partial关键字

    这节讲一下partial(局部的,部分的)关键字,初学者可能没有接触过这个关键字,但是只要你写过winform或者WPF应用程序的话,那你肯定被动用过这个关键字。...首先介绍一下这个关键字的作用,它用作定义一个部分类,也就是说,对于一个类,你可以写在不同的文件中(当然不能超出命名空间的限定),通过partial声明,系统就会自动讲分布在不同地方的类联系在一起。...窗体应用程序,分为界面文件(.design)和代码文件(.cs),这两者之间就是通过partial关键字联系在一起的,所以这也是为什么说被动用过的原因。...) 不能有返回值 参数可以为ref,但是不能为out 不能使用virtual,abstract,override,new,sealed,或extern修饰符 部分类有这么多限制...对部分类和部分方法声明和作用,读者做了解即可,开发中很少使用。 本节到此结束...

    35040

    C++中的常量与关键字

    宏定义 #define 和常量 const 的区别类型和安全检查不同宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查编译器处理不同宏定义是一个...;const常量需要进行内存分配,存储于程序的数据段中定义域不同void f1 (){ #define N 12 const int n 12;}void f2 (){ cout函数中}定义后能否取消宏定义可以通过#undef来使之前的宏定义失效const常量定义后将在定义域内永久有效...void f1(){ #define N 12 const int n = 12; #undef N //取消宏定义后,即使在f1函数中,N也无效了 #define N 21//取消后可以重新定义...}是否可以做函数参数宏定义不能作为参数传递给函数const常量可以在函数的参数列表中出现

    29630

    C++ 中 const 和 constexpr关键字解析:常量、函数和指针

    很多C++的初学者看到const这个关键字的第一反应都是一头雾水,主要是因为const可以出现在很多的位置,以及后面加入的constexpr更是常常感到困惑,今天就为大家一一解释出现它们的含义和以及作用...很多的全局变量都是通过常量来进行修饰,需要注意的是,使用const关键字修饰的变量需要立刻初始化 // 修饰局部变量,全局变量,成员变量 const int a = 2; // 错误,表达式必须是可修改的左值...,通常用于函数的参数列表中,因为我们知道在C++中函数参数有3中传递方式,分别是值传递,指针传递(或者叫地址传递),引用传递,前两种在传递时都会发成拷贝行为 指针本身也是一个变量,在32位操作系统下占用...是C++11中引入的一个关键字,它的作用主要是用来修饰一些函数和变量,使其成为常量表达式,从而在编译器就可以进行计算,进一步提高程序运行期的效率 常量表达式:指的是有一个或多个常量组成的表达式,在实际开发中经常会接触到常量表达式...constexpr还可以用于修饰函数的返回值,在C++11中被constexpr修饰的函数只能是非void类型的函数,而且必须非常简短,通常只有一句return表达式。

    98420

    【C++11特性篇】C++11中の【override】【final】关键字——帮助用户检测是否重写

    【override】【final】关键字——帮助用户检测是否重写(C++11) 从上面可以看出,C++对函数重写的要求比较严格,但是有些情况下由于疏忽,可能会导致函数 名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出的...,只有在程序运行时没有 得到预期结果才来debug会得不偿失,因此:C++11从两个角度提供了 override 和 final 两个关键字,可以帮 助用户检测是否重写。...final:表示虚函数不能被重写,被重写即报错 override:检查虚函数是否重写了别的虚函数,重写了即报错 【1】 final:表示虚函数不能被重写,被重写即报错 class Car { public...class Benz :public Car { public: virtual void Drive() {cout << "Benz-舒适" << endl;} }; 【2】override:检查虚函数是否重写了别的虚函数

    9710

    C++中mutable关键字的用法

    代码编译运行环境:VS2012+Win32+Debug ---- mutalbe的中文意思是“可变的,易变的”,是constant(即C++中的const)的反义词。...在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量将永远处于可变的状态。...mutable的作用有两点: (1)保持长量对象中大部分数据成员仍然是“只读”的情况 下,实现对个别数据成员的修改。 (2)使const函数可修改对象的mutable数据成员。...因为static数据成员存储在全局静态存储区,属于类,不属于类对象,那么常对象和常函数对其可以任意的修改,所以类的static数据成员根本不需要mutable的修饰。...但对于常对象的数据成员则不可以被修改,若想修改,则需要mutable的修饰。

    49910

    Java 主函数 main 中的关键字 static

    近期在学习的时候才翻出来再看看,其中可能比较难理解的是关键字 static public 这个关键字在这个函数中很好理解,就是表示这个函数是可以被其他类访问到。...void 表示这个函数不返回任何数据。 这个也比较好理解,因为这个函数是主程序的入口,通常是不需要返回结果的。使用 void 也没关系。...String[] args 这个表示的是这个函数可以从执行的时候获得的输入参数。 就是告诉这个函数在执行的时候,你可以在命令行中定义一些参数,然后这个函数通过获得这些参数来对运行进行调整。...static 这个就是我们需要说明一下的重点了。 我们都知道 static 是表示静态的意思,为什么在 main 函数里面需要静态关键字修饰?...我们可以应用 ava static关键字在变量,方法,块和嵌套类中。 static关键字属于类,而不是类的实例。 被 static 关键字修饰的不需要创建对象去调用,直接根据类名就可以去访问。

    76500

    C#中的override和new关键字

    如果对Java熟悉的朋友,可能会认为是结果: 这是父类方法 这是子类方法 但是其实运行结果是: 这是父类方法 这是父类方法 这是因为Java中的类方法默认是虚函数(虽然Java中没有这个叫法),子类函数会默认覆盖父类的同名函数...然而C#中必须使用virtual关键字显示声明该函数是虚函数,然后在子类中使用override关键字重写父类方法,这才真正实现了对父类方法的重写,才能实现多态(C++中的多态就是使用虚函数实现的,而且和...c2.fun();子类C2使用new关键字隐藏了父类的方法,相当于子类中的fun()方法是直接继承自父类的。...如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。...如果 override 关键字和 new 关键字均未指定,编译器将发出警告,并且派生类中的方法将隐藏基类中的方法。

    1.3K20

    C++20中`typename`关键字的变化

    在C++20中,typename关键字在许多上下文中不再需要用于消除类型歧义。这一变化是基于C++标准委员会的提案P0634R3,旨在简化模板编程。...背景在C++17及之前的版本中,当模板中的嵌套名称(如T::type)可能被解释为类型时,必须在前面加上typename关键字,以消除编译器的歧义。...例如,以下代码在C++20中是合法的:template T::iterator getIterator(); // C++20中不再需要typename适用范围虽然typename...Example {};此外,在函数参数列表中,typename也仍然是必需的:template void func(typename T::type param); // typename...仍然需要优点这一变化使得模板代码更加简洁,减少了冗余的typename关键字,同时也降低了模板编程的复杂性。

    7410
    领券