C++追根究底(持续更新)
头文件
" " 与 <>的区别
<>先去系统目录中找头文件,如果没有在到当前目录下找。所以像标准的头文件 stdio.h、stdlib.h等用这个方法。
""首先在当前目录下寻找,如果找不到,再到系统目录中寻找。 这个用于include自定义的头文件,让系统优先使用当前目录中定义的。
带 .h 和不带 .h 的区别
C++标准化之前的头文件就是带后缀名的文件,标准化后的头文件就是不带后缀名的文件。C++ 98 规定用户应使用新版头文件,对旧版本头文件不在进行强制规范,但大多数编译器厂商依然提供旧版本头文件,以求向下兼容。
C++标准化增加了名称空间概念,借以将原来声明在全局空间下的标识符声明在了namespace std下。使用新版头文件(如#include )的时候,使用函数前要用 using namespace std; 导入命名空间,而 使用旧版头文件(如#include <iostream.h>) 则不用。
带 c前缀 和不带 c前缀 的区别
为了和C语言兼容,C++标准化过程中,原有C语言头文件标准化后头文件名前带个c字母,如cstdio、cstring、ctime、ctype等等。这些头文件都可以在系统目录下(如C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include)找到。
如果要用C++标准化了的C语言头文件,就得作如下的转换:
#include <stdio.h> --> #include <cstdio>
#include <stdlib.h> --> #include <cstdlib>
#include <string.h> --> #include <cstring>
宏定义
#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。
- 简单的宏定义:
#define <宏名> <字符串>
例: #define PI 3.1415926
- 带参数的宏定义
#define <宏名> (<参数表>) <宏体>
例: #define A(x) x
一个标识符被宏定义后,该标识符便是一个宏名。在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换。
特殊符号:#,##,#@
- #x:给x加双引号
#define ToString(x) #x
//str="123132";
char* str = ToString(123132);
- x##y:表示x连接y
#define Conn(x,y) x##y
//n=123456;
int n = Conn(123,456);
- #@x:给x加上单引号
#define ToChar(x) #@x
//a='1';
char a = ToChar(1);
//报错
char a = ToChar(123);
防止一个头文件被重复包含
#ifndef BODYDEF_H
#define BODYDEF_H
//头文件内容
#endif
do-while 作用
do-while 语句的一个特点便是,会优先执行一次语句块,而后再判断 while 中的条件是否成立。当我们把 while 设置为 while(0) 时,那么 while 条件永不成立,do 后面语句块中的代码只会执行一次。
宏定义的多行代码用 do { /* ... */ } while(0) 包围起来可以减少歧义:
#include <stdio.h>
#define MACRO_FUNC() \
do \
{ \
printf("Hello\n"); \
printf("World\n"); \
} while(0)
/* 根据上面例子的描述,我们不应该在宏定义末尾添加分号 */
int main()
{
if(2 > 1)
MACRO_FUNC();
else
printf("Fail.\n");
return 0;
}
假设没有用do-while或只使用{},后面的else部分必然会报错。
注:宏定义函数编写时需要换行时,需要使用续行符——反斜杠 ''。
undef 的用法
当用完一个宏,不希望下面的代码再用到这个宏,,那么就可以#undef它。下面如果再用到这个宏,编译器就会报错。常用做法为:
#define MAX 50
#include "common.h"
#undef MAX
这样就只有在common.h中才能使用宏MAX。
函数外部加括号
部分函数在使用时需要用括号括起来,如:
cout << (numeric_limits<int>::min)() << endl;
因为Microsoft在 WinDef.h 中定义了两个宏 max 和 min,函数名和宏同名时,要么 #undef ,要么用小括号括起来。
参考资料
- C++ #include " " 与 <>有什么区别?
- C++中#include包含头文件带 .h 和不带 .h 的区别
- C++宏定义详解
- C/C++ 语言宏定义函数编写时 do-while 的妙用和一些注意事项
C++追根究底(持续更新)的更多相关文章
- 神技!微信小程序(应用号)抢先入门教程(附最新案例DEMO-豆瓣电影)持续更新
微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...
- iOS系列教程 目录 (持续更新...)
前言: 听说搞iOS的都是高富帅,身边妹子无数.咱也来玩玩.哈哈. 本篇所有内容使用的是XCode工具.Swift语言进行开发. 我现在也是学习阶段,每一篇内容都是经过自己实际编写完一遍之后,发现 ...
- ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)
前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...
- git常用命令(持续更新中)
git常用命令(持续更新中) 本地仓库操作git int 初始化本地仓库git add . ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- 基于android studio的快捷开发(将持续更新)
对于Android studio作为谷歌公司的亲儿子,自然有它的好用的地方,特别是gradle方式和快捷提示方式真的很棒.下面是我在实际开发中一些比较喜欢用的快速开发快捷键,对于基本的那些就不多说了. ...
- 总结js常用函数和常用技巧(持续更新)
学习和工作的过程中总结的干货,包括常用函数.常用js技巧.常用正则表达式.git笔记等.为刚接触前端的童鞋们提供一个简单的查询的途径,也以此来缅怀我的前端学习之路. PS:此文档,我会持续更新. Aj ...
- 我的敏捷、需求分析、UML、软件设计电子书 - 下载(持续更新中)
我将所有我的电子书汇总在一起,方便大家下载!(持续更新) 文档保存在我的网站——软件知识原创基地上(www.umlonline.org),请放心下载. 1)软件设计是怎样炼成的?(2014-4-1 发 ...
- React Native之坑总结(持续更新)
React Native之坑总结(持续更新) Genymotion安装与启动 之前我用的是蓝叠(BlueStack)模拟器,跑RN程序也遇到了一些问题,都通过搜索引擎解决了,不过没有记录. 但是Blu ...
- RedHat 和 Mirantis OpenStack 产品的版本和功能汇总和对比(持续更新)
Mirantis 和 Red Hat 作为 OpenStack 商业化产品领域的两大领军企业,在行业内有重要的地位.因此,研究其产品版本发布周期和所支持的功能,对制定 OpenStack 产品的版本和 ...
随机推荐
- 遥感图像处理笔记之【FastAI Multi-label image classification】
遥感图像处理学习(4) 前言 遥感系列第4篇.遥感图像处理方向的学习者可以参考或者复刻 本文初编辑于2023年12月15日 2024年1月24日搬运至本人博客园平台 文章标题:FastAI Multi ...
- Asp.net平台常用的框架整理
分布式缓存框架: Microsoft Velocity:微软自家分布式缓存服务框架. Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度. Redis:是一个高性能的K ...
- OSW Analyzer分析oswbb日志发生异常
具体OSW Analyzer详细介绍可以参考MOS文档: OSWatcher Analyzer User Guide (Doc ID 461053.1) 我们常用的就是拿到一份osw数据到自己电脑,使 ...
- 深入浅出 testing-library
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:佳岚 The more your tests resemb ...
- 《ASP.NET Core 与 RESTful API 开发实战》-- (第8章)-- 读书笔记(上)
第 8 章 认证和安全 8.1 认证 认证(Authentication)是指验证用户身份的过程,授权(Authorization)是验证一个已经通过认证的用户是否有权限做某些事的过程 常见的 HTT ...
- JS 前序遍历、中序遍历、后序遍历、层序遍历详解,深度优先与广度优先区别,附leetcode例题题解答案
壹 ❀ 引 按照一天一题的速度,不知不觉已经刷了快两多月的leetcode了,因为本人较为笨拙,一道简单的题有时候也会研究很久,看着提交了两百多次,其实也才解决了70来道简单题,对于二分法,双指针等也 ...
- NC15688 Operating System
题目链接 题目 题目描述 在学习Operating System的过程中,Glory遇到了这样一个问题,现在有一个大小为可以容纳N个页面的内存,硬盘内的内容被分成M个页面,用1~M来标识,一开始内存里 ...
- InnoDB中不同SQL语句设置的锁
锁定读(locking read).更新(UPDATE)或删除(DELETE)通常会在SQL语句处理过程中扫描的每个索引记录上设置记录锁.语句中是否存在排除行的WHERE条件并不重要.InnoDB不记 ...
- CORS就是跨域吗?
首先,跨域的域是什么? 跨域的英文是:Cross-Origin. Origin 中文含义为:起源,源头,出生地. 在跨域中,"域"指的是一个 Web 资源(比如网页.脚本.图片等) ...
- 【Android】使用Messenger实现进程间通讯
1 Messenger 简介 Messenger 类实现了 Parcelable 接口,用于进程间传输并处理消息,调用流程如下: Client 通过 bindService() 请求绑定 Serv ...