C++57个入门知识点_番外5_extern 关键字详解

参考地址:c++ extern 关键字详解

extern关键字在C++中用于声明变量或函数的外部链接。它通常用于以下几种场景:

  • 声明全局变量:在一个文件中定义变量,在其他文件中使用extern声明该变量,以便在多个文件之间共享。
  • C和C++混合编程:在C++代码中引用C语言编写的函数或变量时,使用extern "C"来防止名称修饰(name mangling),从而使C++编译器能够正确链接C函数。

1. extern关键字的使用示例

1.1 声明全局变量

假设有两个文件,file1.cpp 和 file2.cpp:

file1.cpp:

#include <iostream>

int globalVar = 42; // 定义全局变量

void printGlobalVar() {
    std::cout << "Global variable: " << globalVar << std::endl;
}

file2.cpp:

#include <iostream>

// 声明全局变量(不定义,只声明)
extern int globalVar;

void modifyGlobalVar() {
    
    
    globalVar = 100;
}

int main() {
    
    
    printGlobalVar();   // 调用 file1.cpp 中的函数
    modifyGlobalVar();  // 修改全局变量
    printGlobalVar();   // 打印修改后的全局变量
    return 0;
}

编译并链接这两个文件:

g++ file1.cpp file2.cpp -o main
./main

输出:

Global variable: 42
Global variable: 100

1.2 C和C++混合编程

假设有一个C语言的头文件和源文件c_code.h和c_code.c,以及一个C++文件main.cpp。
c_code.h:

#ifndef C_CODE_H
#define C_CODE_H

void c_function();

#endif

c_code.c:

#include "c_code.h"
#include <stdio.h>

void c_function() {
    
    
    printf("This is a C function.\n");
}

main.cpp:

#include <iostream>
extern "C" {
    
    
    #include "c_code.h" // 使用 extern "C" 防止名称修饰
}

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

编译并链接这两个文件:

g++ main.cpp c_code.c -o main
./main

输出:

This is a C function.

2. 详细说明

2.1 声明与定义

  • 声明:告诉编译器变量或函数的名称和类型,但不分配内存。例如,extern int x;只是声明变量x,不定义它。
  • 定义:不仅声明变量或函数,还分配内存。例如,int x = 42;定义并初始化变量x。

2.2 名称修饰(Name Mangling)

C++编译器会对函数名称进行修饰,以支持函数重载。这可能导致C语言编写的函数在C++代码中无法正确链接。extern "C"阻止名称修饰,使C++编译器使用C语言的链接规范。

2.3 作用域

extern变量的作用域是全局的,多个文件可以共享相同的变量。这在大型项目中尤其有用,允许模块之间共享数据。

3. 注意事项

  • 初始化:extern变量不能在声明时初始化,只能在定义时初始化。例如,extern int x = 42;是错误的,应该是int x = 42
  • 避免重复定义:确保每个全局变量只有一个定义。在其他文件中使用extern声明变量,而不是重复定义。

通过合理使用extern关键字,可以在C++程序中实现模块化和代码共享,提高代码的可维护性和可扩展性。

猜你喜欢

转载自blog.csdn.net/Dasis/article/details/142992725