在C语言中,当在头文件中声明变量或函数时,使用extern
和不使用extern
修饰有以下区别:
extern
修饰变量:
extern
修饰的变量只是声明,不分配存储空间。它表示该变量的定义在其他源文件中,需要在使用该变量的源文件中进行定义和分配存储空间。extern
修饰的变量则是定义,会分配存储空间。它表示该变量的定义和分配存储空间在当前源文件中。例如,假设我们有一个名为globals.h的头文件,其中声明了一个全局变量:
// globals.h
extern int globalVariable;
如果在另一个源文件中包含该头文件并使用该全局变量,需要在该源文件中进行定义和分配存储空间:
// main.c
#include
#include "globals.h"
int globalVariable; // 定义和分配存储空间
int main() {
globalVariable = 10;
printf("The value of globalVariable is: %d\n", globalVariable);
return 0;
}
extern
修饰函数:
extern
修饰的函数只是声明,表示该函数的定义在其他源文件中,需要在使用该函数的源文件中进行定义。extern
修饰的函数则是定义,表示该函数的定义和实现在当前源文件中。例如,假设我们有一个名为functions.h的头文件,其中声明了一个函数:
// functions.h
extern int add(int a, int b);
如果在另一个源文件中包含该头文件并调用该函数,需要在该源文件中进行函数的定义和实现:
// main.c
#include
#include "functions.h"
int add(int a, int b) { // 函数的定义和实现
return a + b;
}
int main() {
int result = add(3, 5);
printf("The result is: %d\n", result);
return 0;
}
总结来说,使用extern
修饰变量或函数的声明表示其定义在其他源文件中,需要在使用的源文件中进行定义和实现。不使用extern
修饰的变量或函数则表示其定义和实现在当前源文件中。
是的,头文件中声明的函数的默认存储类别是extern
。
在C语言中,函数的默认存储类别是extern
,即使没有显式地使用extern
关键字进行声明。这意味着,如果在头文件中声明一个函数,它会被默认视为是一个在其他源文件中定义的函数。
例如,假设我们有一个名为functions.h的头文件,其中声明了一个函数:
// functions.h
int add(int a, int b); // 默认存储类别为extern
然后,在另一个源文件中包含该头文件,并在该源文件中定义和实现该函数:
// main.c
#include
#include "functions.h"
int add(int a, int b) { // 在当前源文件中定义和实现函数
return a + b;
}
int main() {
int result = add(3, 5);
printf("The result is: %d\n", result);
return 0;
}
在这个例子中,我们没有在函数声明中使用extern
关键字,但是函数add
仍然被视为是一个在其他源文件中定义的函数。这是因为在C语言中,函数的默认存储类别是extern
。
需要注意的是,对于全局变量来说,默认存储类别也是extern
,但是对于局部变量来说,默认存储类别是auto
。因此,在头文件中声明全局变量时,也可以省略extern
关键字。