C语言中,`extern` 和 `#include`

C语言中,extern 和 #include

1. #include

#include 是C语言中的预处理指令,用于将指定文件的内容插入到当前文件中。通常用于包含头文件(.h 文件),头文件中通常包含函数声明、宏定义、类型定义等。

使用场景:

  • 将函数声明、宏定义、结构体定义等共享内容放在头文件中。
  • 在多个源文件中共享相同的声明或定义。

示例:

头文件 functions.h
c 复制代码
#ifndef FUNCTIONS_H
#define FUNCTIONS_H

// 函数声明
void demo();

// 全局变量声明
extern int globalVar;

#endif
源文件 functions.c
c 复制代码
#include <stdio.h>
#include "functions.h"

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

// 函数定义
void demo() {
    printf("This is the demo function.\n");
}
主文件 main.c
c 复制代码
#include "functions.h"

int main() {
    demo();  // 调用函数
    globalVar = 20;  // 修改全局变量
    printf("Global variable value: %d\n", globalVar);
    return 0;
}

特点:

  • #include 是将头文件的内容直接插入到当前文件中。
  • 适合共享函数声明、宏定义、结构体定义等。
  • 头文件通常使用 #ifndef、#define、#endif 防止重复包含。

2. extern

extern 是C语言中的关键字,用于声明一个变量或函数是在其他文件中定义的。它告诉编译器:"这个变量或函数的定义在其他地方,不要在这里分配存储空间。"

使用场景:

  • 在多个源文件中共享全局变量。
  • 在头文件中声明全局变量或函数,避免重复定义。

示例:

头文件 globals.h
c 复制代码
#ifndef GLOBALS_H
#define GLOBALS_H

// 全局变量声明
extern int globalVar;

// 函数声明
void demo();

#endif
源文件 globals.c
c 复制代码
#include <stdio.h>
#include "globals.h"

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

// 函数定义
void demo() {
    printf("This is the demo function.\n");
}
主文件 main.c
c 复制代码
#include "globals.h"

int main() {
    demo();  // 调用函数
    globalVar = 20;  // 修改全局变量
    printf("Global variable value: %d\n", globalVar);
    return 0;
}

特点:

  • extern 只是声明变量或函数的存在,不会分配存储空间。
  • 适合在多个源文件中共享全局变量。
  • 通常与头文件一起使用,避免重复定义。

3. #include 和 extern 的区别

特性 #include extern
作用 将指定文件的内容插入到当前文件中。 声明变量或函数是在其他文件中定义的。
使用场景 共享函数声明、宏定义、结构体定义等。 共享全局变量或函数声明。
存储空间分配 不涉及存储空间分配。 不涉及存储空间分配。
文件类型 通常用于头文件(.h 文件)。 可以用于头文件或源文件。
重复包含问题 需要使用 #ifndef 防止重复包含。 无重复包含问题。

4. 如何选择使用 #include 和 extern

使用 #include 的情况:

  • 需要共享函数声明、宏定义、结构体定义等。
  • 需要将多个源文件共享的内容集中到一个头文件中。

使用 extern 的情况:

  • 需要在多个源文件中共享全局变量。
  • 需要在头文件中声明全局变量或函数,避免重复定义。

5. 综合示例

文件结构:

复制代码
project/
├── main.c
├── globals.h
└── globals.c
头文件 globals.h
c 复制代码
#ifndef GLOBALS_H
#define GLOBALS_H

// 全局变量声明
extern int globalVar;

// 函数声明
void demo();

#endif
源文件 globals.c
c 复制代码
#include <stdio.h>
#include "globals.h"

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

// 函数定义
void demo() {
    printf("This is the demo function.\n");
}
主文件 main.c
c 复制代码
#include "globals.h"

int main() {
    demo();  // 调用函数
    globalVar = 20;  // 修改全局变量
    printf("Global variable value: %d\n", globalVar);
    return 0;
}

输出:

复制代码
This is the demo function.
Global variable value: 20

总结

  • #include 用于将文件内容插入到当前文件中,适合共享函数声明、宏定义等。
  • extern 用于声明变量或函数是在其他文件中定义的,适合共享全局变量。
  • 在实际项目中,通常会将 #include 和 extern 结合使用,以实现模块化编程和代码共享。
相关推荐
Lhan.zzZ4 分钟前
用 Qt 构建线程安全的通讯静态库:从线程亲和性到完整工程
c++·vscode·qt·tcp/ip·udp
lpfasd12316 分钟前
推荐算法进化史
算法·机器学习·推荐算法
xiaoye-duck22 分钟前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(上):初始化和全量响应
开发语言·网络·c++·语言模型
Pniubi26 分钟前
力扣543二叉树的直径(深度优先搜索法(递归))
算法·leetcode·职场和发展
fpcc28 分钟前
跟我学c++中级篇—streambuf在glog中的应用分析
开发语言·c++
码匠许师傅39 分钟前
【C++三方组件】OpenCV:计算机视觉的事实标准
c++
C^h10 小时前
c++ string
开发语言·c++
听风说ml10 小时前
socket编程 【C语言】
c语言·udp·tcp·socket编程
raindayinrain10 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的10 小时前
C++ 合并命名空间
开发语言·c++·网络安全