extern

extern 关键词的运用

概述

extern 关键字在C和C++语言中主要用于声明变量或函数是在其他文件或本文件的其他位置定义的。这允许程序的不同部分共享变量和函数的定义。

在C语言中的运用

声明全局变量

当你在一个源文件中定义了一个全局变量,并希望在另一个源文件中访问它时,你需要在那个源文件中使用 extern 关键字来声明这个变量。

globals.c

1
2
// 定义全局变量  
int globalVar = 10;

main.c

1
2
3
4
5
6
7
8
9
#include <stdio.h>  

// 声明全局变量,表示它在其他地方定义
extern int globalVar;

int main() {
printf("全局变量的值为: %d\n", globalVar);
return 0;
}

声明函数

虽然对于函数来说,extern 关键字不是必需的(因为函数默认就是全局的,并且默认就是 extern 的),但它仍然可以用来显式地声明一个函数是在其他地方定义的。

functions.h

1
2
// 声明函数  
void myFunction();

functions.c

1
2
3
4
5
6
#include "functions.h"  

void myFunction() {
// 函数实现
printf("Hello from myFunction!\n");
}

main.c(使用函数)

1
2
3
4
5
6
7
#include <stdio.h>  
#include "functions.h"

int main() {
myFunction(); // 调用函数
return 0;
}

在C++中的运用

声明全局变量

C++中全局变量的声明方式与C相同。

声明函数

C++中函数的声明方式与C也类似,但extern的使用更加侧重于与C语言的互操作性。

与C语言代码的互操作性

当C++代码需要调用C语言编写的函数时,为了防止C++的名称修饰(Name Mangling)机制影响链接,可以使用 extern "C"

c_functions.h

1
2
3
4
5
6
7
8
9
#ifdef __cplusplus  
extern "C" {
#endif

void cFunction();

#ifdef __cplusplus
}
#endif

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>  
#include "c_functions.h"

extern "C" {
// 这里通常不需要再次使用extern "C",除非在C++文件中直接包含C代码
// 但为了示例的完整性,这里展示其用法
void cFunction();
}

int main() {
cFunction(); // 调用C语言编写的函数
std::cout << "Back in C++\n";
return 0;
}

请注意,在实际使用中,extern "C" 通常放在头文件中,以便在C++和C的源文件中都能正确地处理链接。上面的 c_functions.h 头文件展示了如何在C和C++之间共享函数声明的典型做法。在C++源文件中,通常不需要再次使用 extern "C" 来声明已经在头文件中用 extern "C" 包裹的函数,除非有特殊情况。