当前位置: 首页 > news >正文

初始Cpp之 三、Cpp预处理器

文章目录

    • 三、C++预处理器
      • (1)头文件名
      • (2)名称空间

三、C++预处理器

​ C++和C语言一样,也使用一个预处理器,在程序进行主编译之前对源文件进行处理,有些C++实现使用翻译器程序将C++程序转化为C语言程序,虽然翻译器也是一种预处理器,但是这里不讨论这种预处理器。而是只讨论以#打头的预处理指令。

(1)头文件名

​ C++中预处理指令#include所包含的文件名,被称为头文件(header file),C++编译器自带了很多头文件,每个头文件都支持一些特定的工具。**C语言的传统是头文件使用拓展名.h,但是C++的用法变了,C++对老式的C语言头文件保留了拓展名.h(C++程序仍然可以使用这种头文件),而C++头文件则没有拓展名。**有些C语言头文件被转化成C++头文件,这些头文件被重新命名,去掉了拓展名.h(使之称为C++的风格的名称),并在文件名前面加上前缀c(表明来自C语言),例如,C++版本的math.hcmath

(2)名称空间

​ 名称空间支持是一项C++特性,旨在编写大型程序以及将多个厂商的现有代码组合起来的程序时更加容易,有助于组织程序。按照这种方式,类、函数和变量都是C++编译器的标准组件,它们现在都被放置在名称空间std中。仅当头文件没有扩展名h时,情况才是这样的。这意味着在iostream中定义的用于输出的cout变量实际上是std::cout,而endl变量实际上是std::endl。为了简化这种操作,可以使用==using==编译指令使得std名称空间中的所有名称都可用,而不必再添加std::前缀。例如:

#include <iostream>			//未使用using编译指令
std::cout << "Hello World!";
std::cout << std::endl;
#include <iostream>		//使用using编译指令
using namespace std;
cout << "Hello World!";
cout << endl;
using namespace std;

这条using编译指令使得std名称空间中的所有名称都可用。这其实是一种偷懒的做法,在大型项目中有一个潜在的问题。更好的方法是,只使所需的名称可用,这可用通过使用using声明来实现:

using std:: cout;			//make cout avaliable
using std:: endl;			//make endl avaliable

用这些编译指令后,便可用使用cout、endl,而不必加上std::前缀。

​ 当前通行的理念是,只让需要访问名称空间std的函数访问它是最好的选择,下面是不同的访问std名称空间的方法:

1、将using namespace std;放在函数定义之前,让文件中所有的函数都能够使用名称空间std中所有元素。

2、将using namespace std;放在特定的函数定义中,让该函数能够使用名称空间std中的所有元素。

3、在特定的函数中使用类似using std::cout;这样的指令,而不是使用using namespace std;让该函数能够使用特定的元素,如cout

4、完全不使用编译指令using,而在需要使用名称空间std中的元素时,使用前缀std::

相关文章:

  • 计算机毕业设计springboot+vue基本微信小程序的校园跑腿平台
  • Flink 运行时架构(三)
  • Python学习:获取对象信息
  • 人工神经网络理论及应用,人工智能神经网络论文
  • 【数据结构与算法】之深入解析“考试的最大困扰度”的求解思路与算法示例
  • SpirngMVC获取请求参数
  • [Spring Cloud 项目] Spring cloud 实现房源查询功能
  • golang设计模式——结构模式
  • CF803G Periodic RMQ Problem【动态开点线段树+ST表】
  • 【业务知识】发票系统设计知识学习二
  • Basic Facilities of a Virtio Device (二)
  • redis五种数据类型对应的底层数据结构
  • Linux 必会基础语句 软硬连接区别 Linux文件类型
  • 【PAT甲级】1141 PAT Ranking of Institutions
  • JAVA基础(三十二)——反射之创建对象
  • @jsonView过滤属性
  • 【翻译】babel对TC39装饰器草案的实现
  • CEF与代理
  • iOS 系统授权开发
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JS题目及答案整理
  • laravel 用artisan创建自己的模板
  • Laravel 中的一个后期静态绑定
  • linux安装openssl、swoole等扩展的具体步骤
  • React Native移动开发实战-3-实现页面间的数据传递
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 从零搭建Koa2 Server
  • 免费小说阅读小程序
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 扑朔迷离的属性和特性【彻底弄清】
  • 浅谈Golang中select的用法
  • 如何利用MongoDB打造TOP榜小程序
  • 软件开发学习的5大技巧,你知道吗?
  • 三分钟教你同步 Visual Studio Code 设置
  • 通信类
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (Git) gitignore基础使用
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot教学评价 毕业设计 641310
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .Net Core 中间件验签
  • .Net Web项目创建比较不错的参考文章
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net 获取url的方法