【C/C++】C++预处理指令介绍
1. 何为预处理指令(Preprocessor Directives):
预处理指令是我们写在程序代码中的给预处理器(preprocessor)的 命令,而不是程序本身的语句。预处理器在我们编译一个C++程序时由编译器自动执行,它负责控制对程序代码的第一次验证和消化。
所有这些指令必须写在单独的一行中,它们不需要加结尾的分号;。
2. #define
#define可以用来生成宏定义常量和宏定义函数,这是一种机械式的替换:
/* 宏定义常量 */
#define MAX_WIDTH 100
char str1[MAX_WIDTH];
char str2[MAX_WIDTH];
/* 宏定义函数 */
#define getmax(a,b) a>b?a:b
int x=5, y;
y = getmax(x,2);
3. #undef
#undef 完成与 #define相反的工作,它取消对传入的参数的宏定义:
#define MAX_WIDTH 100
char str1[MAX_WIDTH];
#undef MAX_WIDTH
#define MAX_WIDTH 200
char str2[MAX_WIDTH];
4. #ifdef, #ifndef, #if, #endif, #else and #elif
这些指令可以使程序的一部分在某种条件下被忽略。
#ifdef 可以使一段程序只有在某个指定常量已经被定义了的情况下才被编译,无论被定义的值是什么。例如:
#ifdef MAX_WIDTH
char str[MAX_WIDTH];
#endif
#ifndef 起相反的作用:在指令#ifndef 和 #endif 之间的代码只有在某个常量没有被定义的情况下才被编译,例如:
#ifndef MAX_WIDTH
#define MAX_WIDTH 100
#endif
char str[MAX_WIDTH];
指令#if, #else 和 #elif (elif = else if) 用来使得其后面所跟的程序部分只有在特定条件下才被编译。这些条件只能够是常量表达式,例如:
#if MAX_WIDTH>200
#undef MAX_WIDTH
#define MAX_WIDTH 200
#elsif MAX_WIDTH<50
#undef MAX_WIDTH
#define MAX_WIDTH 50
#else
#undef MAX_WIDTH
#define MAX_WIDTH 100
#endif
char str[MAX_WIDTH];
5. #line
当我们编译一段程序的时候,如果有错误发生,编译器会在错误前面显示出错文件的名称以及文件中的第几行发生的错误。
指令#line 可以使我们对这两点进行控制,也就是说当出错时显示文件中的行数以及我们希望显示的文件名。它的格式是:
#line number "filename"
这里number 是将会赋给下一行的新行数。它后面的行数从这一点逐个递增。
filename 是一个可选参数,用来替换自此行以后出错时显示的文件名,直到有另外一个#line指令替换它或直到文件的末尾。例如:
#line 1 "assigning variable"
int a?;
这段代码将会产生一个错误,显示为在文件"assigning variable", line 1 。
6. #error
这个指令将中断编译过程并返回一个参数中定义的出错信息,例如:
#ifndef __cplusplus /* 假如__cplusplus没有被定义就会出错 */
#error A C++ compiler is required
#endif
7. #include
这个指令我们已经见到很多次。当预处理器找到一个#include 指令时,它用指定文件的全部内容替换这条语句。声明包含一个文件有两种方式:
#include "file"
#include <file>
两种表达的唯一区别是编译器应该在什么路经下寻找指定的文件。第一种情况下,文件名被写在双引号中,编译器首先在包含这条指令的文件所在的目录下进行寻找,如果找不到指定文件,编译器再到被配置的默认路径下(也就是标准头文件路径下)进行寻找。
如果文件名是在尖括号 <> 中,编译器会直接到默认标准头文件路径下寻找。
8. #pragma
这个指令是用来对编译器进行配置的,针对你所使用的平台和编译器而有所不同。要了解更多信息,请参考你的编译器手册。
如果你的编译器不支持某个#pragma的特定参数,这个参数会被忽略,不会产生出错。
9. 预定义的宏名称 (Predefined 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