C/C++中#ifndef与#define的区别及避免变量重复定义
需积分: 32 145 浏览量
更新于2024-09-14
收藏 35KB DOC 举报
"#indef 与#define 区别于用法"
在编程中,`#define` 和 `#ifndef/#endif` 结合使用是预处理器指令,它们在处理头文件时起到防止重复包含的作用,避免因多次包含同一头文件导致的符号冲突。`#define` 是 C/C++ 预处理器的一个宏定义命令,用于定义常量或宏,而 `#ifndef` 和 `#endif` 通常用于创建条件编译块,确保头文件只被编译一次。
`#ifndef` 指令的含义是“如果不未定义”,它检查标识符(通常是头文件的名字)是否已被定义。如果标识符未被定义,那么该块内的代码将被编译。接着 `#define` 会定义这个标识符,使得后续的 `#ifndef` 检查会忽略此头文件。最后,`#endif` 表示条件编译块的结束。
例如,对于头文件 stdio.h,正确的使用方式是:
```cpp
#ifndef STDIO_H_
#define STDIO_H_
// 头文件内容
#endif // STDIO_H_
```
在这个例子中,`STDIO_H_` 是一个自定义的标识符,用来表示 stdio.h 是否已经被处理过。这样做是为了防止在多个源文件中包含 stdio.h 时发生冲突。
然而,将变量定义(如 `int i;`)放在 `#ifndef` 块内会导致问题。在 C++ 中,每个 `.cpp` 文件(或者在某些情况下,`.c` 文件)都会独立编译成 `.obj` 文件,如果在不同的源文件中多次定义相同的全局变量,链接阶段会报错。而在 C 语言中,未初始化的全局变量被视为弱符号,因此多个相同未初始化的变量声明可以共存,但在 C++ 中,全局变量默认为强符号,所以不允许重复定义。
为了解决这个问题,应遵循以下最佳实践:
1. 不要在头文件中定义变量,而是在对应的 `.cpp` 文件(或 `.c` 文件)中定义。头文件应该只包含函数声明和 extern 变量声明。
2. 使用 `extern` 关键字在头文件中声明变量,这样其他文件可以知道变量的存在,但不会尝试定义它。
3. 在实现文件(`.cpp` 或 `.c`)中定义变量,这样每个变量只会被定义一次。
例如:
`x.h`
```cpp
#ifndef __X_H__
#define __X_H__
extern int i;
#endif // __X_H__
```
`x.c`
```cpp
#include "x.h"
int i;
```
通过这种方式,`i` 只会在 `x.c` 文件中定义一次,其他包含 `x.h` 的文件只会知道 `i` 的存在,而不会尝试重新定义。
总结,`#define` 主要用于定义常量或宏,`#ifndef/#endif` 用于防止头文件重复包含,而全局变量应避免在头文件中定义,而是用 `extern` 声明并在对应的源文件中定义。理解这些概念对于编写可维护且无冲突的 C/C++ 代码至关重要。
2018-05-29 上传
2017-01-23 上传
2020-12-18 上传
2020-12-22 上传
2021-01-20 上传
2020-11-24 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
JIYIxz
- 粉丝: 2
- 资源: 15
最新资源
- 全国江河水系图层shp文件包下载
- 点云二值化测试数据集的详细解读
- JDiskCat:跨平台开源磁盘目录工具
- 加密FS模块:实现动态文件加密的Node.js包
- 宠物小精灵记忆配对游戏:强化你的命名记忆
- React入门教程:创建React应用与脚本使用指南
- Linux和Unix文件标记解决方案:贝岭的matlab代码
- Unity射击游戏UI套件:支持C#与多种屏幕布局
- MapboxGL Draw自定义模式:高效切割多边形方法
- C语言课程设计:计算机程序编辑语言的应用与优势
- 吴恩达课程手写实现Python优化器和网络模型
- PFT_2019项目:ft_printf测试器的新版测试规范
- MySQL数据库备份Shell脚本使用指南
- Ohbug扩展实现屏幕录像功能
- Ember CLI 插件:ember-cli-i18n-lazy-lookup 实现高效国际化
- Wireshark网络调试工具:中文支持的网口发包与分析