C/C++ 为什么#ifndef 头文件 要用大写加下划线?(这就是一种约定俗成的规范)
如图,防止头文件重复包含,为什么要用大写加下划线?为什么不是直接写peripherals.h
,我已经在问了
解释:
- 首先,test.h不是合法的C标识名:合法的C标识名只能由字母、数字和下划线组成,且以字母或下划线开头,也就是说你不能#define test.h
- 然后,不是#ifdef而是#ifndef,两者含义恰恰相反:前者如果定义;后者如果没定义
- 综合理解就是:如果没有定义xx标识就定义xx标识,然后执行#endif之前所有的定义、声明……如果已定义了xx 标识,就什么也不做。这个即便是多次引用同一个头文件也不会发生重复定义、声明……的异常
- 最后,其实你可以使用任何合法的C标识名来实现上述功能。但是,通用的语法规范:常量使用大写,_前导符一般用于全局定义标识符……遵从这些规范可以让编写的代码更便于理解同时也能尽量避免重复定义的出现。
参考文章1:#ifdef头文件时为什么要大写加下划线? - 登峰的回答 - 知乎
参考文章2:条件编译 #ifndef _HEAD_H…中下划线的理解!
问:
如果我的头文件是abc_____test.h,中间有很多个下划线,那应该写成什么呢?#ifndef ABC_____TEST_H吗?
答:
随便你写什么,那就是个标识符,你自己定义的,用字母、数字和下划线组成即可(当然这本场景下,最好大写,并且让人看得懂),当然你写
#ifndef __AB__HF_SF__
#define __AB__HF_SF__
声明
#endif
随便取名都是完全可以的,因为宏名字的含义是给人看的
这种if
代码结构才是给编译器看的
C/C++ 为什么#ifndef 头文件 要用大写加下划线?(这就是一种约定俗成的规范)相关推荐
- 关于 SAP Spartacus feature library 里的 _index.scss 文件,和神奇的下划线省略行为
如下图所示:quick order 文件夹下存在一个 _index.scss 文件,其导入了 styles 文件夹下的 index: 然而,styles 文件夹下并没有 index.scss 文件,只 ...
- 为什么VS2019的解决方案资源管理器中的文件名和文件夹名里的下划线不显示?
各路大神,请教一下:这里的文件名和文件夹名中间不是空格,是下划线,就是不显示,重装也不行,怎样可以显示出来?
- ifndef/define/endif——主要目的是防止头文件的重复包含和编译
原文:http://www.jb51.net/article/100939.htm 原文:https://blog.csdn.net/abc5382334/article/details/180527 ...
- #ifndef 在头文件中的作用
在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时 ,就会出现大量"重定义"的错误.在头文件中实用#ifndef #define #e ...
- [C++] 头文件中的#ifndef,#define,#endif以及#pragma用法
想必很多人都看过"头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用".但是是否能理解"被重复引用"是什么意思?头文件被重复 ...
- C++ 头文件 #ifndef #define #endif 作用及用法
为什么要加定义 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声 ...
- 头文件为什么要加#ifndef #define #endif
一 #ifndef 在头文件中的作用 一个大的软件工程里有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量"重定义"的错误.这时在头文件中使用#ifn ...
- 【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 )
文章目录 I . JNI 与 NDK 区别 II . Visual Studio 编译动态库 III. 配置 导入 jni.h 头文件 IV . IntelliJ IDEA Community Edi ...
- ios c语言头文件,iOS开发 -- C语言基础12(预处理指令)
iOS开发 -- C语言基础12(预处理指令) 宏定义 预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源 ...
最新文章
- 2018.9.8-9.8 统计学课程笔记(2)-参数统计
- 插入排序之——直接插入排序(c/c++)
- Qt字符串与整形转换
- Linux下mysql5.1修改密码,Linux下MySQL忘记密码
- windows nginx c++读取请求数据_轻松应对百万并发的Nginx,搞懂LinuxC/C++这些技术栈升职加薪...
- 福字背景|传统中国风国潮设计必备素材!
- ionic入门教程第五课-举例子说明异步回调$q及$q在项目中的用法
- 解决/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found问题
- 用c语言elgamal共密钥密码加密算法,非对称密钥体制RSA加密原理
- NHibernate Issues之1898:命名查询
- 皮尔逊相关系数公式手写代码【Python+详细注解】(Pearson correlation coefficient)
- 熊猫烧香病毒 杀毒记
- primordials is not defined错误,正确的解决方案 亲测 完美 好用
- RocketMQ消息消费源码分析(二消息的消费)
- linux安装nginx1.21.1全教程(含安装包)
- 【PyQt】PyQt+百度API实现图像识别应用(附代码)
- 【佳学基因人工智能】在ANACOND3下如何安装NUMPY
- jvc ip camera vnc10u 设置
- 360电视盒子项目暂时搁浅
- SpringBoot-生成验证码