Preprocessor directives 预处理器指令

预处理器指令是指那些包含在我们代码中的预处理器语句行,这些预处理器语句不是真正的代码语句,但是他们指导程序如何进行编译.这些语句总是以 ‘#’ 开头.预处理器指令在代码真正编译开始之前执行,因此在任何语句生成代码之前预处理器移除所有的预处理指令。
一条预处理指令仅占一行.只要发现新行的存在就认为预处理语句结束了.预处理语句后面不能加“;” . 将一条预处理指令扩展为多行的唯一方法是在每行语句后面加上 反斜杠 “\”.
macro definitions (#define, #undef)

我们可以使用 #define定义预处理宏. 格式如下:
#define identifier replacement

#undef 取消宏定义指令  格式如下:

#undef macro

##  作用是 黏贴俩符号:

1
2

#define glue(a,b) a ## b

glue(c,out) << "test";

上述的代码会被处理成:

cout << "test";

条件包含指令(#ifdef, #ifndef, #if, #endif, #else and #elif)

行控制指令 (#line)

当我们编译一个程序,编译过程中由错误发生的时候,编译器会显示错误信息支出哪个文件哪一行发生错误,以便我们更方便找到并处理错误

#line 指令允许我们对这种方式进行控制,当错误发生的时候,错误所在行号和文件名都会被显示. 使用格式如下: 
#line number "filename"

1
2

#line 20 "assigning variable"

int a?;

错误指令 (#error)

当发现该指令的时候终止编译进程, 产生一个编译错误,并且将错误作为参数:

1
2
3

#ifndef __cplusplus

#error A C++ compiler is required!

#endif

Source file inclusion (#include)

Pragma  指令(#pragma)

该指令通常用于指定编译器的不同选项.这些选项与你所用的平台和编译器相关. 请查阅你的编译器手册或指南来获取更多关于#pragma指令参数的信息。

如果你的编译器不支持 #pragma指令 , 预处理器就会忽略该指令,而不会产生任何错误。

预定义的宏名

一下的几个宏在任何时候都被定义:

macro

value

__LINE__

代表当前被编译文件所处的行的行号

__FILE__

当前被编译文件的文件名

__DATE__

当前编译开始时的日期 形式为 “月/日/年”

__TIME__

编译进程开始时的时间 , 形式为 “时:分:秒”

__cplusplus

一个整型值. 所有的C++编译器都将这个宏定义为某个整型值.如果编译器完全符合C++标准的话,根据其遵循的C++标准版本,这个值应该大于等于1997 或11L

例:

1
2
3
4
5
6
7
8
9
10
11
12
13

// standard macro names

#include <iostream>

using namespace std;

int main()

{

cout << "This is the line number " << __LINE__;

cout << " of file " << __FILE__ << ".\n";

cout << "Its compilation began " << __DATE__;

cout << " at " << __TIME__ << ".\n";

cout << "The compiler gives a __cplusplus value of " <<

__cplusplus;

return 0;

}

This is the line number 7 of file /home/jay/stdmacronames.cpp.

Its compilation began Nov  1 2005 at 10:12:29.

The compiler gives a __cplusplus value of 1

C++:预处理指令的更多相关文章

  1. 预处理指令#pragma

    #pragma介绍 #pragma是一个预处理指令,pragma的中文意思是『编译指示』.它不是Objective-C中独有的东西(貌似在C/C++中使用比较多),最开始的设计初衷是为了保证代码在不同 ...

  2. C/C++预处理指令#define,#ifdef,#ifndef,#endif…

    2016年12月29日更新: 今天查看以前文件的时候, 突然发现了#error 这个预处理指令.然后回想一下工作, 发现这个指令使用场景还是很多的.比如: 一个项目的模块儿之多,源文件之大,代码之多, ...

  3. Effective Objective-C 2.0 — 第四条:多用类型常量,少用#define预处理指令

    第四条:多用类型常量,少用#define预处理指令 使用#define 预处理的坏处:定义出来的常量没有类型信息,编译器只是会在编译前据此执行查找与替换操作.即使有人重新定义了常量值,编译器也不会产生 ...

  4. VC中预处理指令与宏定义详解

    刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能. 一个 ...

  5. C#中的预处理指令

    C#中的预处理指令 作为预处理中的一对:#region name ,#endregion可能是大家使用得最多的,我也常用它来进行代码分块,在一个比较长的cs文件中,这么做确实是一件可以让你使代码更清晰 ...

  6. C#学习笔记(十五):预处理指令

    C#和C/C++一样,也支持预处理指令,下面我们来看看C#中的预处理指令. #region 代码折叠功能,配合#endregion使用,如下: 点击后如下: 条件预处理 条件预处理可以根据给出的条件决 ...

  7. iOS预处理指令

    预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器.可见预处理过程先于编译器对源代码进行处理. 预处理指令是以#开头的代码行,#后是指令关键字,在关键字和#号之间允许存在任意个数的空 ...

  8. #pragma预处理指令讲解

    在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...

  9. C# 预处理指令

    导读 1.什么是预处理 2.预处理的好处 3.C#中的常见预处理指令 4.总结 什么是预处理         在计算机科学中,预处理通常是指利用某一程序(通常是预处理器)对某一格式的源码(如.cs C ...

  10. C学习笔记之预处理指令

          一.什么是预处理指令            预处理指令是告诉编译器在编译之前预先处理的一些指令,有宏定义,文件包括,条件编译. 预处理指令一般以 # 号开头,能够出如今文件的不论什么地方, ...

随机推荐

  1. AJAx 刷新页面

    <html><head> <meta http-equiv="Content-Type" content="text/html; chars ...

  2. User already has more than 'max_user_connections' active connections

    vi /etc/my.cnf修改  max_user_connections 参数的数值,重启 MySQL 服务器

  3. Laravel框架开发规范-修订前期版

    1.追加App/Models目录,App/User.php迁移至App/Models目录中 ①配置内容属于架构信息.服务器信息.有必要隐藏无法提交git的信息,请使用.env文件配合env()方法进行 ...

  4. sqlserver 按日、周、月统计方法

    摘自于网络网络:http://blog.csdn.net/wanmdb/article/details/8080636 create table T(日期时间 datetime, 数量 int) in ...

  5. “psql: could not connect to server: Connection refused” Error when connecting to remote database

    问题: I am trying to connect to a postgres database installed in a remote server using the following c ...

  6. 2.Perl 多线程:Threads(线程返回值)

    use warnings; use strict; use threads; sub TEST{ print "Hello, World!\n"; 'a'/); } #返回列表方法 ...

  7. Spring框架_代理模式(静态代理,动态代理,cglib代理)

    共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                 ...

  8. 一些常用数据库操作在mysql及sql server中实现方式的差异

    因为本文强调的是不同点,所以先讲述不同点,再讲相同点. 一.不同点 1.创建表时主键id的自增实现方式不一样 mysql数据库的实现方式是auto_increment,示例如下 CREATE TABL ...

  9. LeetCode OJ 96. Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  10. flash/flex 编译错误汇总

    来源:http://blog.chinaunix.net/uid-366408-id-116463.html 代码 消息 说明   1000 对 %s 的引用不明确. 引用可能指向多项.例如,下面使用 ...