经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++追根究底(持续更新) - time-flies
来源:cnblogs  作者:time-flies  时间:2021/6/21 10:12:54  对本文有异议

头文件

" " 与 <>的区别

<>先去系统目录中找头文件,如果没有在到当前目录下找。所以像标准的头文件 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语言头文件,就得作如下的转换:

  1. #include <stdio.h> --> #include <cstdio>
  2. #include <stdlib.h> --> #include <cstdlib>
  3. #include <string.h> --> #include <cstring>

宏定义

#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义

  • 简单的宏定义:
  1. #define <宏名>  <字符串>

例: #define PI 3.1415926

  • 带参数的宏定义
  1. #define <宏名> (<参数表>) <宏体>

例: #define A(x) x

一个标识符被宏定义后,该标识符便是一个宏名。在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换

特殊符号:#,##,#@

  • #x:给x加双引号
  1. #define ToString(x) #x
  2. //str="123132";
  3. char* str = ToString(123132);
  • x##y:表示x连接y
  1. #define Conn(x,y) x##y
  2. //n=123456;
  3. int n = Conn(123,456);
  • #@x:给x加上单引号
  1. #define ToChar(x) #@x
  2. //a='1';
  3. char a = ToChar(1);
  4. //报错
  5. char a = ToChar(123);

防止一个头文件被重复包含

  1. #ifndef BODYDEF_H
  2. #define BODYDEF_H
  3. //头文件内容
  4. #endif

do-while 作用

do-while 语句的一个特点便是,会优先执行一次语句块,而后再判断 while 中的条件是否成立。当我们把 while 设置为 while(0) 时,那么 while 条件永不成立,do 后面语句块中的代码只会执行一次。

宏定义的多行代码用 do { /* ... */ } while(0) 包围起来可以减少歧义:

  1. #include <stdio.h>
  2. #define MACRO_FUNC() do { printf("Hello\n"); printf("World\n"); } while(0)
  3. /* 根据上面例子的描述,我们不应该在宏定义末尾添加分号 */
  4. int main()
  5. {
  6. if(2 > 1)
  7. MACRO_FUNC();
  8. else
  9. printf("Fail.\n");
  10. return 0;
  11. }

假设没有用do-while或只使用{},后面的else部分必然会报错。
注:宏定义函数编写时需要换行时,需要使用续行符——反斜杠 ''

undef 的用法

当用完一个宏,不希望下面的代码再用到这个宏,,那么就可以#undef它。下面如果再用到这个宏,编译器就会报错。常用做法为:

  1. #define MAX 50
  2. #include "common.h"
  3. #undef MAX

这样就只有在common.h中才能使用宏MAX。

函数外部加括号

部分函数在使用时需要用括号括起来,如:

  1. cout << (numeric_limits<int>::min)() << endl;

因为Microsoft在 WinDef.h 中定义了两个宏 max 和 min,函数名和宏同名时,要么 #undef ,要么用小括号括起来

参考资料

原文链接:http://www.cnblogs.com/timefiles/p/CProgrammingLanguageParticulars.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号