extern的用法1.声明2.链接

1.extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义

2.extern也可用来进行链接指定。

对于变量来说。
extern int a;//声明一个全局变量a
int a; //定义一个全局变量a
extern int a =0 ;//定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。
int a =0;//定义一个全局变量a,并给初值,
声明之后你不能直接使用这个变量,需要定义之后才能使用。
第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。
糊涂了吧,他们看上去可真像。但是 定义只能出现在一处。也就是说,不管是int a;还是int a=0;都只能出现一次,而那个 extern int a可以出现很多次
当你要引用一个全局变量的时候,你就要声明extern int a;这时候extern不能省略,因为省略了,就变成int a;这是一个定义,不是声明。
链接
extern的原理很简单,就是告诉 编译器 :“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的 全局变量 ,你要放行!”
如我们在A.cpp中写
extern int i;//声明变量i在其他文件中已经定义了。
int main()
{
i=100;//将i初始化。
}
B文件里面有
int i;//定义了全局变量i

 

<think>好的,我需要回答关于在C语言中使用extern关键字声明函数的问题,特别是涉及.h和.c文件的正确用法和示例。首先,我得回顾一下extern的基本概念。根据引用中的信息,extern用于在多个文件之间共享变量,通过在.c文件中定义变量,在.h中用extern声明。但这里的问题是关于函数的,所以我需要调整思路。 首先,函数默认是extern的,所以在声明函数时,通常不需要显式使用extern,但有时候为了明确可见性,可能会用到。不过用户的问题是如何正确使用extern函数,所以需要分情况讨论。在C语言中,函数的声明和定义有什么区别呢?函数声明通常放在.h文件中,而定义在.c文件中。当其他文件包含这个.h文件时,就能知道函数的存在。 根据引用[3]中的例子,extern用于变量声明,避免重复定义错误。同样的逻辑可能适用于函数,但通常函数在头文件中声明时不需要extern,因为函数默认是extern的。不过,可能在头文件中使用extern声明函数,然后在不同的.c文件中实现它们。 需要确认的是,用户可能混淆了变量和函数的extern用法。对于函数,头文件中只需要声明函数原型,不需要加extern,因为函数默认是外部链接的。例如,在头文件中写void myFunc();,然后在源文件中定义。但是如果要在多个文件中共享函数,确保在头文件中声明,并在源文件中定义一次。 不过用户的问题明确提到extern函数,所以可能他们需要知道如何显式使用extern声明函数。比如,在头文件中使用extern void myFunc();,然后在源文件中实现。但实际上,extern对于函数声明是可选的,因为默认就是extern的。不过,显式使用extern可能更清晰,或者在某些情况下需要,比如当函数被定义为static时,但那是另一回事了。 接下来要考虑示例的正确结构。比如,一个头文件udp.h中使用extern声明函数,然后在udp.c中定义函数,其他文件包含udp.h后即可调用。需要给出这样的例子,并解释步骤。 可能存在的误区是,用户可能认为函数声明必须用extern,但实际上不需要。需要指出这一点,但根据引用中的例子,变量需要extern,而函数默认不需要,但用户可能希望看到显式的extern用法,所以可以举例说明两种方式。 总结步骤: 1..h文件中用extern声明函数(或省略extern)。 2. 在对应的.c文件中定义函数。 3. 其他.c文件包含该.h文件即可调用函数。 需要确保示例代码正确,并解释每个步骤的作用。同时,引用相关的参考资料,比如引用[3]中的例子是关于变量的,但可以类比到函数。同时,注意用户提到的错误情况,如重复定义,这在函数中如果多次定义也会出现,所以正确使用声明和定义的区别是关键。 最后,生成相关问题,可能涉及extern函数的作用、与static的区别、头文件多次包含的处理等。</think>在C语言中,使用`extern`关键字声明函数的主要目的是**跨文件共享函数**,其核心规则是:**在头文件(.h)中声明函数,在源文件(.c)中定义函数**。以下是具体用法和示例: --- ### 一、`extern`函数的正确用法 1. **在头文件中声明函数** 使用`extern`显式声明函数的原型(可省略`extern`,因为函数默认是外部链接的): ```c // udp.h #ifndef UDP_H #define UDP_H extern void send_data(int value); // 显式声明 void receive_data(void); // 隐式声明(默认extern) #endif ``` 2. **在源文件中定义函数** 在对应的`.c`文件中实现函数: ```c // udp.c #include "udp.h" void send_data(int value) { // 具体实现 } void receive_data(void) { // 具体实现 } ``` 3. **在其他文件中调用函数** 包含头文件后即可跨文件调用: ```c // main.c #include "udp.h" int main() { send_data(100); receive_data(); return 0; } ``` --- ### 二、关键注意事项 1. **`extern`的可选性** 函数声明默认具有外部链接性,因此`extern`可以省略。显式添加`extern`是为了增强代码可读性[^3]。 2. **避免重复定义** 函数在项目中只能定义一次,否则会引发链接错误。头文件中仅包含声明,不包含定义[^2]。 3. **头文件保护** 使用`#ifndef`和`#define`防止头文件被多次包含,避免重复声明错误。 --- ### 三、错误用法示例 1. **在头文件中定义函数** 会导致多个包含该头文件的源文件重复定义函数: ```c // 错误示例:udp.h void send_data(int value) { ... } // 直接定义函数 ``` 2. **未声明直接使用** 如果未在头文件中声明函数,其他文件将无法调用: ```c // main.c send_data(100); // 编译错误:未声明的函数 ``` --- ### 四、`extern`与`static`的对比 | 关键字 | 作用范围 | 适用场景 | |--------|----------------|---------------------------| | `extern` | 全局可见 | 跨文件共享函数或变量 | | `static` | 文件内可见 | 隐藏函数/变量,避免命名冲突 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值