C++的预处理器预处理器指令包括如下12个。
if #else #elif #endif #ifdef #ifndef #undef
error #line #pragma #include #define
第一行7个就是控制语句,重点在后面5个。
1. #define
#definemacro-name char-sequence
define定义了一个标识符和一个字符序列。每次在源程序中遇到该标识符就用定义的字符序列替代它。
标识符被即宏名;替换过程即宏替换。
#defineONE 1
#defineTWO ONE + ONE
#definePI 3.14
#defineERRMSG "ERR!!!"
//.......
printf(ERRMSG);
宏定义中如果字符序列超过一行,可以在末尾用反斜杠续行
#defineLONGSTRING "this is a very very \
very very.......\
longstring"
宏名不一定要大些,但C++程序员大都习惯用大些字母。并且习惯常将所有的宏集中在一或多个单独的头文件中。
宏名可以有变元。遇到宏名时,其定义中所用的变元均由实际程序中的变元来代替。这一点很像inline函数。但define的对象,编译器只是做简单的字符替换,其他操作例如类型检查。应尽量使用inline来代替define。
#include<stdio.h>
#defineABS(a) (a)<0? -(a) :(a)// 这里的括号很重要
intmain(void)
{
printf("abs of -1 and 1: %d %d", ABS(-1), ABS(1));
return0;
}
#error
#errorerror-message//error message不用双引号括起来
error主要用在调试中,强迫编译器停止编译 。错误信息会随编译的其他信息一同显示。
#include
#include<xx.h>//使用编译器创建者定义的方式查找
//通常是从项目定义的众多包含目录下开始
#include"xx.h"//使用其他实现所定义的方式查找
//通常是从当前工作目录开始,
//如未找到,则按<>的规定继续查找
#line
#linenumber "filename"
用来改变__LINE__和__FILE__的内容。这两个标识符是编译器中预先定义的标识符。
前者表示已编译的代码行数,后者是一字符串,包含已编译的源文件名。
number为__LINE__的新值,filename为任意有效的文件名标识符,是__FILE__ 的新值。
#pragma
pragma是一个实现时定义的指令,用它向编译器传送各种指令。例如
#pragmaonce
#和##预处理器运算符
和##与#define一起使用。
,stringize运算符,使它后面的变元转换成带引号的串。
#include<stdio.h>
#definemkstr(s) #s
intmain(void)
{
//I like C++ 就是mkstr宏中的s,
//预处理器将这一大串加上引号变成"I like C++"
printf(mkstr(I like C++));
return0;
}
,pasting运算符,用于连接两个符号。
#include<stdio.h>
#defineconcat(a,b) a##b
intmain(void)
{
intxy=10;
printf("%d", concat(x,y));//预处理器将其变成打印xy的值
return0;
}
预定义的宏名
LINE FILE DATE TIME STDC __cplusplus
原文链接: https://www.cnblogs.com/mumuliang/archive/2010/11/24/1886891.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/17817
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!