预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
1."#“和”##"
(1).#define PI 3.1415926
(2).#define PASTE(n) “asdfg”#n
printf("%s",PASTE(15)); //输出:asdfg15
(3).#define NUM(a,b,c) a##b##c
printf("%d",NUM(1,2,3)); //输出123
2.常见预处理命令
(1).定义变量(define)和取消定义变量(undef)。
#define pi 3.14
int main()
{
return 0;
}
#undef pi
(2).条件预处理语句(只有在满足一定条件的时候才编译某部分内容)。#if、#ifdef、#ifnedf、#else、#elif、#endif。
#define MAX 10
int main()
{
#if MAX > 99
cout<< 123 <<endl;
#else
cout<< 456 <<endl;
#endif
return 0;
}
//当所指定的标识符被define定义时,仅编译程序#ifdef下的程序段,否则编译#else下的程序段。
#define debug
int main()
{
#ifdef DEBUG
cout << 111 << endl;
#else
cout << 222 << endl;
#endif
system("pause");
return 0;
}
(3).包含头文件命令(include)
#include
#include “stdio.h”
(4).#line修改代码行的行号。
#line 8 //改变当前行的编号
#line 8 “a.c” //改变当前行的编号,改变当前编译源文件的名字。
#include <stdio.h>
#include<iostream>
using namespace std;
#line 1 "y1.c"
int main()
{
printf("ling ID:%d,FileName = %s\n", __LINE__, __FILE__);
#line 3 "y3.cpp"
printf("ling ID:%d,FileName = %s\n", __LINE__, __FILE__);
#line 5
printf("ling ID:%d,FileName = %s\n", __LINE__, __FILE__);
system("pause");
return 0;
}
输出:
(5).特殊命令预处理(“error”,“pragam”,“NULL”)
1)"error"强制编译程序停止编译,并给出提示信息。执行了该语句,后面的程序将不在继续执行。
#include <stdio.h>
#include<iostream>
using namespace std;
//如果没有定义宏"__DOS",编译报错"DOS OS is required."。如果定义了,成功编译。
#define __DOS
#ifndef __DOS
#error DOS OS is required.
#endif
int main()
{
cout << "The OS is DOS!" << endl;
system("pause");
return 0;
}
2).#pragma指定特殊的指令给编译器。
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
其格式一般为: #Pragma Para
我在另外一篇博客看到一个比较好的,推荐大家可以去看看:https://blog.csdn.net/zaishaoyi/article/details/46517233