素材路径:https://www.codeforge.cn/read/428275/bsmap-2.74-_-main.cpp__html
1.C/C++预处理指令,常见的预处理指令如下:
- #空指令,无任何效果
- #include包含一个源代码文件
- #define定义宏
- #undef取消已定义的宏
- #if如果给定条件为真,则编译下面代码
- #ifdef如果宏已经定义,则编译下面代码
- #ifndef如果宏没有定义,则编译下面代码
- #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
- #endif结束一个#if……#else条件编译块
- #error停止编译并显示错误信息
参考:https://www.cnblogs.com/zi-xing/p/4550246.html
什么是预处理指令?
预处理指令是以#号开头的代码行(起注释作用是双反斜杠开头,eg: //global variables)。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
以前没有在意的学者注意了,预处理指令是在编译器进行编译之前进行的操作.预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。在很多编程语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码(防止重复包含某些文件)。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。
#include 用法
这个预处理指令,我想是见得最多的一个。放在代码文件头,用于告诉编译器,文件中包含的头文件属于预处理文件的一部分。
语法为:
#include <iostream.h> (这句是程序编译时搜索系统目录文件) 这种格式告诉预处理程序在编译器自带的或外部库的头文件中搜索被包含的头文件。
#include “HName.h" (这句是程序编译时搜索当前项目的文件)这种格式告诉预处理程序在当前被编译的应用程序的源代码文件中搜索被包含的头文件,如果找不到,再搜索编译器自带的头文件。
采用两种不同包含格式的理由在于,编译器是安装在公共子目录下的,而被编译的应用程序是在它们自己的私有子目录下的。一个应用程序既包含编译器提供的公共头文件,也包含自定义的私有头文件。采用两种不同的包含格式使得编译器能够在很多头文件中区别出一组公共的头文件。
2.C++编程时几乎每次都敲上using namespace std;但这行代码究竟有什么作用呢?
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
早些的编码将标准库功能定义在全局空间里(所以并不需要注明使用什么命名空间),声明在带.h后缀的头文件里。C++标准为了和C区别开,也为了正确地使用命名空间,规定头文件不使用后缀.h。因此,当使用<iostream.h>时,相当于在C中调用库函数,使用的是全局命名空间,也就是早期的C++实现。当使用<iostream>时,该头文件没有定义全局命名空间,必须使用namespace std,指明在哪里的命名空间,这样才能使用类似于cout这样的C++标识符。
为什么尽量不要使用using namespace std? 参考知乎:https://www.zhihu.com/question/26911239
说法一:通常来讲,一个能平衡洁癖和效率的方法是只在cpp文件里面using namespace。只要编译器不抱怨,你就写using namespace std;。直到有一个名字冲突了,再用一些诡异的方法来解决。不然要用什么都写一大串using std::cout,那算上其他库,加上什么IO啊、GUI啊、各种乱七八糟的,你得写几万行using,不要活了。我不相信有人在写一个实用的企业程序的时候,能够坚持不using namespace。而且那些喜欢搞*的人,其实他们的做法还可以再极端——名字都用::开头,完美保证不会被覆盖。
说法二:就是怕名字冲突嘛。可是,你写的什么代码,能和系统库冲突?只是千万不要在头文件里用,你不知道这个using能覆盖到多大范围。在cpp文件,所有include之后用,没什么问题。(不要在任何include之前用,那和放在头文件里没区别);
说法三:还有是不建议用的,譬如大牛说法;
说法四:就是引诱有一堆自以为很牛逼的人,爱写max min swap move forward 这样的“单谓词”函数名。这些牛逼的命名很容易和std名字空间有冲突。推荐咱们自己的函数(不是类的成员函数)命名,最好使用谓语+宾语规则。如果怕和std有冲突,要么是谓语和宾语加分隔符,要么定义大写命名规范。
个人观点:支持一二四的说法和建议。