C++:预处理指令

时间:2022-11-07 01:12:33

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