extern 和 include

本文详细解析了C及C++编程语言中extern与include指令的作用。extern用于声明函数或变量定义位于其他文件中,在C++或C/C++混合编程中尤为重要。include则用于引入函数声明和常量定义,确保程序的正确编译与链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    extern的作用是指出当前文件中用到的函数或变量的定义是在别的文件中。不过在纯c文件的工程中,extern显得毫无用处,因为c规定函数不能同名(C++中同名称为重载),在一个文件中用到的函数不在本身的文件出现就必定在其他文件中定义,所以没有必要写extern。如果此文件中出现其他文件中同名的函数或变量,连接时会报重复定义的错误。但在C++中就不同了(或者c和C++并存的工程中,这也是extern的常用之处,见下面“extern在c和c++联编的作用”)。
    下面说说include的作用:对调用人家的函数而言,其实include的实际作用是告诉其他程序员这个文件中的函数是来自哪些头文件对应的库而已,可以不写include某某头文件, 只要在连接时连接进这个函数所在的.o文件就可以了。当然从整个软件体系架构的可读性来说不提倡。
    include的一个很重要的作用是include进函数的申明,一个例子是atof(),可以不包含<stdlib.h>而直接编译通过,但是转换的结果打印出来就会发现不是你想要的原来的值;但是如果include了<stdlib.h>后结果就很正确,原因是<stdlib.h>中包含了对atof()的申明。我想标准C 库是一个万能.o库,它能用于各种不同的平台(处理器)。当我们inlcude <stdlib.h>后,表明我们用的是<stdlib.h>对应平台的那个atof()。如果是这样,每个平台的<stdlib.h>应该有点不同。
    对常量而言,include的就不能去掉,因为他的作用是引入在头文件中的定义的常量。
下面是一个例子,去掉包含的头文件也可以通过.做法如下
gcc -c main.c
gcc -c inlucde/fun.c
gcc main.o fun.o -o main  #如果在windows下就是gcc main.o fun.o -o main.exe
运行main正常输出结果

/***********************    main.c        ***********************************/
#include <stdio.h>
#include <stdlib.h>
//#include "include/fun.h"//这个不加也可以编译通过

extern void myprint(char *str);//这个函数在fun.c中定义,更极端的做法是连这一行也去掉,可以编译通过
int main()
{    myprint("the test of extern");
    exit(EXIT_SUCCESS);
}
/***********************    fun.c        ***********************************/
//#include <stdio.h>
//#include <string.h>
void myprint(char *s)
{    printf("%d\n",strlen(s));    //gcc -c fun.c竟然能编译通过,不需要包含<string.h>,所以可以看到gcc在编译的时候只是做语法检查
   printf("%s\n",s);
}

/**************************************************************************/

extern在c和c++联编的作用
见如下两个文件(main()对fun()调用),main.cpp用c++方式编译,fun.c用c方式编译,由于编译方式不一样,所以这里extern表明fun()和c_var的符号是以c方式命名的,调用时也要用c命名方式调用,否则连接时出错。
/***********************    main.cpp   ***********************************/
extern "C"
{   void fun();
    int c_var;
}
void main()
{   fun();
}
/***************************    fun.c    *********************************/
int c_var;
void fun()
{    ...
}
/**************************************************************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值