内部函数与外部函数&extern

内部函数与外部函数

1. 普通函数(外部函数)

普通函数是在整个程序范围内可见的。它们可以在定义它们的文件之外的其他文件中访问。这些函数不使用 static 关键字。

示例
// file1.c
#include <stdio.h>

void externalFunction() {
  printf("This is an external function.\n");
}

// file2.c
void externalFunction(); // 声明外部函数

int main() {
  externalFunction(); // 调用外部函数
  return 0;
}

在上述代码中,externalFunction 是一个外部函数,可以在整个程序范围内访问。

2. 静态函数(内部函数)

静态函数是在文件范围内可见的函数。这些函数使用 static 关键字声明,只能在定义它们的源文件中访问。这有助于封装和隐藏实现细节,使得其他文件无法直接访问这些函数。

示例
// file1.c
#include <stdio.h>

static void internalFunction() {
  printf("This is an internal function.\n");
}

void callInternalFunction() {
  internalFunction();
}

在上述代码中,internalFunction 是一个内部函数,只能在 file1.c 文件中访问。

总结

  • 外部函数:在整个程序范围内可见,可以在其他文件中访问。外部函数是默认的链接类型,不需要特殊关键字。
  • 内部函数:通过使用 static 关键字声明,只能在定义它们的文件中访问。这有助于保护代码的封装性,防止不必要的访问。
    外部函数允许跨文件的函数调用,促进代码的模块化和重用。而内部函数则有助于限制函数的可见性,保护代码的封装性。

请注意,这里的“外部函数”和“内部函数”是为了解释目的而使用的术语。在 C 语言规范中,您可能不会找到这些术语的正式定义。外部函数通常只是普通的函数,而内部函数通常是使用 static 关键字声明的函数。

外部文件中使用外部函数的方式

1. 使用函数声明

在调用外部函数的源文件中,可以直接声明该函数。这告诉编译器函数的返回类型和参数,以便正确地调用它。

示例
// file1.c
#include <stdio.h>

void externalFunction() {
  printf("This is an external function.\n");
}

// file2.c
void externalFunction(); // 声明外部函数

int main() {
  externalFunction(); // 调用外部函数
  return 0;
}

在上述代码中,file2.c 通过直接声明 externalFunction 来访问 file1.c 中定义的外部函数。

2. 使用头文件

另一种常见的做法是将外部函数的声明放在头文件中,并在需要访问该函数的源文件中包含该头文件。这使得代码更加模块化和可维护。

示例
// external.h
void externalFunction(); // 声明外部函数

// file1.c
#include <stdio.h>
#include "external.h"

void externalFunction() {
  printf("This is an external function.\n");
}

// file2.c
#include "external.h"

int main() {
  externalFunction(); // 调用外部函数
  return 0;
}

在上述代码中,externalFunction 的声明位于 external.h 头文件中。file1.cfile2.c 都包含了这个头文件,因此 file2.c 可以访问 file1.c 中定义的外部函数。

总结

  • 使用函数声明:可以直接在调用外部函数的源文件中声明该函数。这是一种快速和简单的方法,但可能会导致代码重复和维护困难。
  • 使用头文件:将外部函数的声明放在头文件中,并在需要访问该函数的源文件中包含该头文件。这是一种更模块化和可维护的方法,特别是在大型项目中。
    两种方法都是有效的,选择哪种方法取决于项目的具体需求和编程风格。

extern 关键字

extern 关键字在 C 语言中用于扩展变量和函数的可见性。它通常与全局变量一起使用,允许在定义变量的文件之外的其他文件中访问该变量。

函数中extern 的用法

您提出了一个很好的问题。在 C 语言中,对于函数的声明,extern 关键字实际上是可选的。让我们深入了解一下:

1. 使用 extern 关键字声明外部函数

您可以使用 extern 关键字来声明外部函数,如下所示:

extern void externalFunction(); // 声明外部函数

这明确地告诉编译器 externalFunction 是在其他地方定义的外部函数。

2. 不使用 extern 关键字声明外部函数

您也可以不使用 extern 关键字来声明外部函数,如下所示:

void externalFunction(); // 声明外部函数

这与使用 extern 关键字的效果相同。编译器会理解这是一个外部函数的声明。

为什么 extern 关键字是可选的?

对于函数,extern 关键字是隐式的。当您声明一个函数但不提供定义时,编译器会自动理解这是一个外部函数的声明。因此,extern 关键字在这种情况下是可选的。

总结
  • 使用 extern 关键字声明外部函数是明确的做法,可以增加代码的可读性。
  • 不使用 extern 关键字也可以声明外部函数,因为对于函数,extern 是隐式的。
  • 在实际编程中,两种做法都是有效的,选择哪种做法取决于编程风格和团队约定。

变量中extern 的用法

  • 声明:声明一个变量或函数表示该变量或函数在程序的某个地方存在,但不为其分配内存。声明还告诉程序变量的类型或函数的参数、返回类型等。
  • 定义:定义一个变量或函数除了声明之外还为其分配内存。定义可以看作是声明的超集。
  • extern 关键字允许在一个文件中声明变量,而在另一个文件中定义它。例如:
  // file1.c
  int var = 10;

  // file2.c
  extern int var;

file2.c 中,使用 extern 关键字声明了 var,这告诉编译器 var 在其他地方已经定义。

示例

以下示例说明了 extern 关键字的用法:

  • 示例 1:定义全局变量
  // file1.c
  int var;

  // file2.c
  extern int var;
  int main(void) {
    var = 10;
    return 0;
  }

这个程序将成功编译。varfile1.c 中定义,并在 file2.c 中通过 extern 关键字访问。

  • 示例 2:仅声明未定义
  // file1.c
  extern int var;
  int main(void) {
    var = 10;
    return 0;
  }

这个程序将在链接阶段抛出错误,因为 var 被声明但未定义。

  • 示例 3:使用初始化的 extern 变量
  extern int var = 0;
  int main(void) {
    var = 10;
    return 0;
  }

这个程序将成功编译。尽管使用了 extern 关键字,但由于变量被初始化,因此为其分配了内存,并被视为定义。

总结

  • extern 关键字用于扩展变量和函数的可见性。
  • 对于函数,extern 是隐式的。
  • 对于变量,extern 允许在一个文件中声明变量,而在另一个文件中定义它。
  • 如果 extern 变量被初始化,则为其分配内存,并视为定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值