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

函数应该在头文件中"extern"吗?

函数应该在头文件中"extern"吗?

这个问题涉及到C++编程语言中的函数声明和定义,以及头文件的使用。在C++中,函数的声明和定义可以分别放在不同的文件中,通过头文件来实现代码的模块化和重用。

首先,我们来了解一下"extern"关键字的作用。"extern"用于声明一个变量或函数,表示该变量或函数的定义在其他文件中,即该变量或函数是在外部定义的。这样,在使用该变量或函数时,编译器就能识别并找到它的定义。

对于头文件,它是一种将代码声明和定义分离的方式,通常以".h"为后缀。在头文件中,我们可以声明全局变量、函数原型等,以便在其他源文件中使用。

现在回到原问题,函数应该在头文件中"extern"吗?答案是:不一定。

在C++中,我们通常在头文件中声明函数原型,而在源文件中定义函数。如果函数是在其他源文件中定义的,我们可以在头文件中使用"extern"关键字声明该函数,以告诉编译器该函数的定义在其他文件中。但如果函数是在同一个源文件中定义的,我们不需要在头文件中使用"extern"关键字。

以下是一个简单的示例:

假设我们有一个源文件"main.cpp"和一个头文件"functions.h"。

"functions.h"文件中声明了一个函数原型:

代码语言:cpp
复制
void myFunction();

"main.cpp"文件中定义了这个函数:

代码语言:cpp
复制
#include "functions.h"

void myFunction() {
    // 函数实现
}

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

在这个例子中,我们不需要在头文件"functions.h"中使用"extern"关键字来声明函数"myFunction()",因为它是在同一个源文件中定义的。

总结:函数不一定要在头文件中使用"extern"声明。我们只需要在头文件中声明函数原型,如果函数的定义在其他源文件中,我们可以使用"extern"关键字进行声明。

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

相关·内容

STLalgorithm头文件下的常用函数

使用algorithm需要在头文件下加using namespace std;才能使用 max()、min()和abs() max(x,y)与min(x,y):返回x和y的最大值和最小值(必须两个参数,...浮点数请使用math头文件下的fabs。...和memset不同,这里的赋值可以时数组类型对应范围的任意值。 sort() 请详见这篇文章。...upper_bound:用来寻找在数组或容器[first,last)范围内的第一个值大于val的元素的位置。 数组和容器如上面同样返回该位置的各自对应的东西。...头文件下的常用函数》 本文链接:https://wnag.com.cn/830.html 特别声明:除特别标注,本站文章均为原创,本站文章原则上禁止转载,如确实要转载,请电联:wangyeuuu@qq.com

93720

函数指针

extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件,提示编译器遇到此变量和函数时在其他模块寻找其定义。...第二,当extern不与"C"在一起修饰变量或函数时,如在头文件: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用...也就是说B模块(编译单元)要是引用模块(编译单元)A定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数...,多线程情况应该在产品侧挂接 if(g_hook_func.func1 !...2、多线程条件下挂接钩子的函数hook_func应该在产品侧挂接,这样即使没有挂接,在lib侧也没有影响。

1.1K60
  • C 语言 static、extern与指针函数介绍

    static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件说明和定义。...对于可在当前源文件以外使用的函数应该在一个头文件说明,要使用这些函数的源文件要包含这个头文件      static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用...,普通函数在每个被调用维持一份拷贝 3.extern(外部变量)  修饰全局变量        extern 不但可以修饰变量还可以修饰函数 全局变量范围已经很广了,为什么还要用extern来修饰呢?...a=%d,b=%d",a,b);   } int a=13,b=5; 上面例子,在定义了a,b之前就使用它,也就是说extern扩展了全局变量的作用范围。...extern不仅上边例子这种用法,在不同文件的全局变量也可以使用extern来使用。 4.指针函数        定义:指针函数就是函数类型和返回值都是指针的函数

    1.5K80

    extern用法总结!

    extern 在源文件A里定义的函数,在其他源文件是看不见的(即不能訪问)。...为了在源文件B里能调用这个函数应该在B的头部加上一个外部声明: extern 函数原型; 这样,在源文件B里也能够调用那个函数了。...假设你不想包括头文件,那么在c/cpp声明该函数。...一般来说,声明定义在本文件的函数不用“extern”,声明定义在其它文件里的函数用“extern”,这样在本文件里调用别的文件定义的函数就不用包括头文件 include “*.h”来声明函数,声明后直接使用就可以...假设把“extern”去掉,程序依旧能够正常执行。   由此可见,“extern”在函数声明可有可无,仅仅是用来标志该函数在本文件里定义,还是在别的文件里定义。

    55420

    【RTOS训练营】继续程序框架、tick中断补充、预习、课后作业和晚课提问

    如下图是第一步: 首先加入输入设备,即把设备放入链表: 然后是初始化,即把链表的每个设备,都调用它的初始化函数。...我们写C程序时有头文件、有C文件。 头文件的作用是什么? 暴露接口 C文件的作用是什么?内部实现 来看看我写的代码: 不想暴露给别人使用的函数, 就是static函数。 就没有必要放在头文件里面。...问: 函数extern是写在被调用的头文件,还是调用的头文件呢,还是说都可以? 答: 对于函数, 加上extern,完全是多此一举,你加、不加extern,它的作用域都是整个程序。...有时候懒得写头文件, 就在 b.c 里加上:extern void A(); 只是为了告诉看代码的人,这个函数A, 是别人实现的。 实际上,你加不加extern都可以。 15....问: 老师,缓冲区能抽象为一个通用的?比如从外部传参数进去,告诉缓冲区的数据成员大小,缓冲区长度。这样不是可以抽象出来了吗? 答: 你这个方法挺好,这就是FreeRTOS的队列。

    47640

    static作用(修饰函数、局部变量、全局变量)

    由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件引起错误。  ...只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件说明和定义。...对于可在当前源文件以外使用的函数应该在一个头文件说明,要使用这些函数的源文件要包含这个头文件. static函数在内存只有一份,普通函数在每个被调用维持一份拷贝。...\n");     }         1.4编译&执行        1.5你可能会问:为什么在static_extern.c定义的全局变量i和函数msg能在static_main.c中使用?...利用这一特性可以在不同的文件定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。

    70620

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

    C++外部变量 上一节有读者咨询extern是什么,这节主要用来解释一下extern在C++的用法,外部变量在函数的外部定义的,它的作用域为从变量的定义处开始,到本程序文件的末尾。...在此作用域内,全局变量可以为本文件各个函数所引用。编译时将全局变量分配在静态存储区,有时需要用extern来声明全局变量,以扩展全局变量的作用域。...如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键字extern,对该变量作外部变量声明,表示该变量是一个将在下面定义的全局变量。...用extern扩展全局变量的作用域,虽然能为C++编码带来方便,但应十分慎重,因为在执行一个文件函数时,可能会改变了该全局变量的值,从而会影响到另一文件函数执行结果。...源码分析: #include//头文件  using namespace std;//命名空间  int Max(int num1,int num2);//函数声明  int num1

    2.6K2828

    Golang函数传参存在引用传递

    Go slice 在传入函数时到底是不是引用传递?如果不是,在函数内为什么能修改其值?...值传递 值传递是指在调用函数时将实际参数复制一份传递到函数,这样在函数如果对参数进行修改,将不会影响到实际参数。 概念总给人一种教科书的感觉,写点代码验证下。...在函数 pFoo ,形参 p 的地址与实参 pa 的地址并不一样,但是他们在内存的值都是变量 a 的地址,因此可以通过指针相关的操作来改变a的值。 ?...图中 &a 表示a的地址,值为: 0xc420080008 引用传递 所谓引用传递是指在调用函数时将实际参数的地址传递到函数,那么在函数对参数所进行的修改,将影响到实际参数。...Go没有引用传递 Go函数调用只有值传递,但是类型引用有引用类型,他们是:slice、map、channel。

    2.3K20

    初级程序员面试不靠谱指南(四)

    #endif    然后在mainfile包含这个头文件并且给这个字符串赋值(这时才进行了定义),大概类似如下所示,这里我们不需要main函数,只是为了掩饰连接属性。编译一下。...,同样采用3里面的例子,不同的是将头文件extern改变成为static,可以看到同样可以通过编译和运行,但是,如果在LinkFile.c调用LinkFileFunc会发现,输出的字符串是null...是不是extern和static变量只能在头文件声明而在源文件定义呢?...这个看起来不经意的问题其实也蕴含了很多的知识点的,比如说extern标记的变量,我们在头文件对roger_str进行定义而不是声明,也就是用在头文件全局的地方使用 char *roger_str=“Roger...但这里出现了一个问题,如果不能包含头文件意味着头文件里面的所有内容想使用的话都需要用extern进行标记,这个对于编程和维护都是极为不便的,所以,带有extern的变量应该在头文件声明,在源文件中进行定义

    62250

    Const的应用与备忘

    即,尽管在1.cpp和2.cpp包含同一个定义了const int a=9;的头文件,但由于const int a=9;是文件作用域的,包含了头文件的1.cpp和2.cpp尽管都包含了const int...a=9;但他们是各自文件内的const对象,两者互不相干,就像不同函数定义了相同的变量名一样。...所以,通过在头文件定义const对象,可以实现多个文件使用相同的常量值,这在实际的程序很常见。...那么如何使用其他文件的const 说到这里,有一点疑问需要解决:如果想在别的文件访问本文件的const对象该怎么办,如果都是单是在别的文件中使用extern const int a = 9;的话,...所以应该在需要被其他文件使用的const对象定义成这样:extern const int a = 9;而在别的需要使用这个const对象的地方声明:extern const int a;前者是定义,后者是声明

    36220

    lnk2001 lnk1120_lnk1120

    一种解决的方法是需要时在头文件中加入该常量的初始化代码,并在.CPP文件包含该头文件;另一种方法是使用时给该变量赋以常数。   ...如果创建C++库时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头文件里却关闭了函数内联(没有inline关键字),这时将得到该错误信息。...为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数。   8.不正确的/SUBSYSTEM或/ENTRY设置也能导致LNK2001。   ...请看下面的示例: extern int i; extern void g(); void f() { i++; g(); } int main() { } 如果在生成包含的某个文件没有定义...符号定义在编译为 C 程序的文件,而符号是在 C++ 文件不带 extern “C” 修饰符声明的。

    1K20

    C++的extern关键字知识点

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件,提示编译器遇到此变量和函数时在其他模块寻找其定义。此外extern也可用来进行链接指定。      ...第二,当extern不与"C"在一起修饰变量或函数时,如在头文件: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用...也就是说B模块(编译单元)要是引用模块(编译单元)A定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数...2 问题:extern 变量   在一个源文件里定义了一个数组:char a[6];   在另外一个文件里用下列语句进行了声明:extern char *a;   请问,这样可以?    ...test2.cpp中使用#include "test1.h",那么test1.h声明的其他函数你也无法使用了,除非也用都用extern修饰,这样的话你光声明的函数就要一大串,而且头文件的作用就是要给外部提供接口使用的

    1K40

    程序员C语言快速上手——进阶篇(八)

    静态全局变量虽然也是在整个程序的生命期中都有效,但它在其他文件不可见,无法被访问。关于这一点的细则,在下面的extern关键字的使用做详细说明。...还是回到上面的例子,如果你是公司特聘人员,一个月只需要上两天班,那么你有必要在公司楼下买一个固定的私人停车位?显然是没有必要的,因此当函数不会被频繁调用时,不应当考虑使用静态局部变量。...extern主要是用来修饰变量的,当然也可以用来修饰函数,通常C语言中的函数都使用头文件包含的方式引入声明,但我们也可以使用extern修饰。...在C++,当需要调用纯C语言编写的函数时,通常会使用extern “C”声明,表明这是纯C语言的内容。...因为所谓头文件包含,实际上就是将头文件的声明复制到当前源文件,那么上例h3.h一定会被复制两次。 问题出来了,该如何解决呢?

    93230

    c语言进阶(1)

    使用尖括号包含的是c语言的头文件,包含自定义用双引号。 那么在下面这个函数,为什么show()函数未定义,程序还是能够运行成功呢?  ...函数的声明本质上也是在内存上开辟空间,只不过变量保存的是数据,而函数保存的是代码,这个代码保存好之后一般是不可被写入的。只要是声明,可以也给extern带上(建议)。...这是因为函数是定义还是声明,编译器取决于它有没有函数体,编译器如果识别到没有函数体,就被解释成了声明。变量声明必须把extern带上。...如果只是单纯的int a;这个语句,编译器有可能把它认为是定义,而头文件当中并不包含,应该包含extern声明。 如果一个函数没有参数,但是我们给它传一个参数,竟然不会报错。...1.全局变量可以跨文件访问?可以。 2.函数可以跨文件访问?可以。 为什么呢?大型项目一定是多文件的,多个文件之间一定要进行数据交互。如果不能跨文件,交互成本比较高。

    8210

    可怕的extern关键字一、不利之处二、例子三、分析四、正确做法

    实际项目中看到有人用extern关键字来声明外部函数,这是一个很不好的行为。 一、不利之处 如果函数原型改变的话,每个extern声明的地方都要改一遍。 如果有地方没改到呢?...二、例子 头文件api.h声明了一个函数func: #ifndef __API_H__ #define __API_H__ void func(int a); #endif 文件api.c实现了...[%d]\n", a); } 文件bad_test.c调用了func函数,但是func被重新声明成无参数的了 #include extern void func(); int main...考虑到默认从右到左的压栈顺序,处于栈顶的argc被取出来塞给func函数作为入参了,所以func打印出来的是argc的值。 都这样了,接下来离各种莫名其妙的异常还远?...四、正确做法 建议通过头文件引用的方式来使用外部函数,如果bad_test.c写成下面这样,编译就无法通过,可以有效阻止错误蔓延。

    1.2K20

    总结c++ primer的notes

    只有当 extern 声明位于函数外部时,才可以含有初始化式。...头文件用于声明而不是用于定义 头文件一般包含类的定义、extern 变量的声明和函数的声明。对于头文件不应该含有定义这一规则,有三个例外。...头文件可以定义类、值在编译时就已知道的const 对象(即const变量是用常量表达式初始化)和inline 函数。 设计头文件不能太大,程序员可能不愿意承受包含该头文件所带来的编译时代价。...因为头文件包含在多个源文件,所以不应该含有变量或函数的定义。...(因为程序定义只能出现一次,如果含有定义头文件包含在多个源文件之中,就会出现重复定义) 一些 const 对象定义在头文件 如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件定义

    1.6K90

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

    通常,在模块的头文件对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A定义的全局变量和函数时只需包含模块A的头文件即可。...如果在模块A函数声明了foo为extern "C"类型,而模块B包含的是extern int foo( int x, int y ) ,则模块B找不到模块A函数;反之亦然。   ...4.extern "C"的惯用法   (1)在C++引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理: extern "C" { #include "cExample.h..." }   而在C语言的头文件,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件包含了extern "C"时会出现编译语法错误。   ...(2)在C引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅将C文件中将C++定义的extern "C"

    98930
    领券