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 结合使用,以实现模块化编程和代码共享。
相关推荐
David猪大卫5 小时前
【Linux修炼】环境变量、进程地址空间
linux·c语言·经验分享·笔记·学习·ubuntu·centos
汉克老师7 小时前
CSP-J 2026 第二轮入门组真题解析(第一题 、旅游)
c++·csp-j·信息学竞赛·小学生学c++
xiaoye-duck8 小时前
《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
老师我太想进步了202611 小时前
【数据结构-4】算法美学之顺序表
数据结构·算法
风影同志7832411 小时前
编码器是激活函数吗?—— 一个看起来很像、其实不是的类比
算法
UIU11411 小时前
P1481 魔族密码
c++·算法·动态规划
Zwawa13 小时前
两根线怎么挂住一堆设备:I2C 协议原理
c语言·单片机·嵌入式
加宝的起点雷达15 小时前
40 条候选里 38 条来自同一个源,主卡整屏重样
人工智能·算法·创业
秋天的怀念_David15 小时前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法