#ifndef的作用及其用法 ————墨白

本文详细解释了在C++编程中,如何利用#ifndef指令避免头文件被重复包含,从而解决因重复声明导致的编译错误。文章提供了具体的使用方法,并强调了正确命名的重要性。
部署运行你感兴趣的模型镜像

我们总是能在读别人的代码时看到头文件里有#ifndef的字符,他到底是什么,又有什么用呢?

如果你有两个.cpp(C++)源文件,这两个.cpp文件都include 了同一个头文件,而在编译时,这两个C++源文件要编译成一个可运行文件,那么完蛋了,大量的声明冲突。如何避免这种悲剧的发生呢?
所以我们要用#ifndef来防止头文件被重复包含。
如何使用#ifndef呢?其实很简单呢,只要把你写的头文件外面加上如下的框架就行了。
#ifndef <标识>//千万要注意这一行是ifndef而不是ifdef,很多朋友反应都用错了
#define <标识>//一旦写成了ifdef那就真完蛋了,相当于头文件没写!






#endif
所谓标识,理论上是可以随便命名的,但为了保证每个头文件的标识唯一,我们一般都遵循如下规则给头文件起标识名:头文件字母全大写,而且要在前后全都加上下划线_,并且要把.也变成下划线-。
例如: stdio.h 标识为 -STDIO-H- stdlib.h 标识为 -STDLIB-H-
Line.h 标识为 -LINE-H-

还有啊,千万不要在头文件中定义变量!!!
如果你看到你的程序错误是因为“XX类型重定义”,那么你一定是忘记给头文件加这个了!

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 关于未终止的 `#ifndef` 的解决方案和最佳实践 在 C/C++ 中,`#ifndef` 是一种常用的条件编译指令,用于检查某个宏是否未定义。如果未定义,则执行其后的代码块,直到遇到对应的 `#endif` 为止。若 `#ifndef` 没有正确终止,可能会导致预处理错误或代码无法正常编译。 以下是一些关于正确终止 `#ifndef` 的解决方案和最佳实践: #### 1. 确保每个 `#ifndef` 都有对应的 `#endif` `#ifndef` 必须与 `#endif` 成对出现。如果缺少 `#endif`,编译器会报错,提示未终止的条件编译块。例如: ```cpp #ifndef MY_MACRO #define MY_MACRO // 代码块 #endif // 正确终止 #ifndef ``` #### 2. 使用缩进和注释提高可读性 为了便于维护和排查问题,建议在 `#endif` 后添加注释,标明对应的宏名或条件编译指令。例如: ```cpp #ifndef MY_MACRO #define MY_MACRO // 代码块 #endif // MY_MACRO ``` 这种方式可以显著减少因嵌套条件编译导致的错误[^4]。 #### 3. 避免嵌套条件编译时的混乱 当存在多层嵌套的条件编译时,容易发生遗漏或错配的情况。例如: ```cpp #ifndef MACRO_A #define MACRO_A #ifndef MACRO_B #define MACRO_B // 代码块 #endif // MACRO_B #endif // MACRO_A ``` 确保每层条件编译都正确关闭,并通过注释明确标识。 #### 4. 使用 `#define` 定义空宏 如果仅需要防止重复包含头文件,可以使用如下模式: ```cpp #ifndef HEADER_FILE_H #define HEADER_FILE_H // 头文件内容 #endif // HEADER_FILE_H ``` 这种模式被称为“include guard”,是防止头文件重复包含的标准方法[^4]。 #### 5. 替代方案:使用 `#pragma once` 现代 C/C++ 编译器支持 `#pragma once`,它是一种更简洁的防止头文件重复包含的方式: ```cpp #pragma once // 头文件内容 ``` 虽然 `#pragma once` 不是 C/C++ 标准的一部分,但几乎所有主流编译器都支持该指令[^4]。 #### 示例代码 以下是一个完整的示例,展示如何正确使用 `#ifndef` 和 `#endif`: ```cpp #ifndef MY_HEADER_H #define MY_HEADER_H #include <iostream> void myFunction() { std::cout << "Hello, World!" << std::endl; } #endif // MY_HEADER_H ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值