C++学习笔记(9)-预处理器

所有的预处理器都以#开始,C++支持的预处理器有很多,比如 #include、#define、#if、#else、#line 等

#define

格式:#define 被替代的名称 替代内容
例如:#define add(a,b) a+b;
宏定义,主要是将代码在编译之前将文件中所有的add(a,b)都替换成a+b

#ifdef和#endif详见第一节

#和##运算符

在学习之前,首先看一下”的例子

#include <stdio.h>  
#include <string.h>  

int main()  
{  
    const char* p1 = "Hello," "World!";     // 一个空格  
    const char* p2 = "Hello,"    "World!";  // 多个空格  
    const char* p3 = "Hello,""World!";      // 没有空格  
    const char* p4 = "Hello,World!";        // 一个整串  
    const char* p5 = "Nihao,""Shijie!";  // 一个不同的串  

    printf("p1 = %s, strlen(p1) = %d\n", p1, strlen(p1));  
    printf("p2 = %s, strlen(p2) = %d\n", p2, strlen(p2));  
    printf("p3 = %s, strlen(p3) = %d\n", p3, strlen(p3));  
    printf("p4 = %s, strlen(p4) = %d\n", p4, strlen(p4));  
    printf("p5 = %s, strlen(p5) = %d\n", p5, strlen(p5));  

    return 0;  
}  

输出为

p1 = Hello,World!, strlen(p1) = 12  
p2 = Hello,World!, strlen(p2) = 12  
p3 = Hello,World!, strlen(p3) = 12  
p4 = Hello,World!, strlen(p4) = 12  
p5 = Nihao,Shijie!, strlen(p5) = 13  

字符串化操作(#)

当用作字符串化操作时,#的主要作用是将宏参数不经扩展地转换成字符串常量。
要点:
宏定义参数的左右两边的空格会被忽略,参数的各个Token之间的多个空格会被转换成一个空格。
宏定义参数中含有需要特殊含义字符如”或\时,它们前面会自动被加上转义字符\。

#include <iostream>
using namespace std;
#define F abc  
#define B def  
#define FB(arg) #arg  
#define FB1(arg) FB(arg)  
int main() {
    cout << FB(  F      B  ) << endl; //F和B无论多少个空格都会被变成一个空格,左右两边的忽略,FB(F B) --> #F B -->"F B" 
    cout << FB1(  F          B  ) << endl; //FB1(F B) --> FB1(abc def) --> FB(abc def) --> #abc def --> "abc def" 
}  

输出:

F B
abc def
标记连接操作(##)

而##被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。

#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d


typedef struct _record_typeLINK_MULTIPLE(name,company,position,salary);

// 这里这个语句将展开为:

// typedef struct _record_type name_company_position_salary;

例子

#include <stdio.h>  
#define paster( n ) printf_s( "token" #n " = %d", token##n )  
int token9 = 9;  

int main()  
{  
   paster(9);  
}  

运算过程

paster(9);
printf_s( "token" #9 " = %d", token##9 );
printf_s( "token" "9" " = %d", token9 );
printf_s( "token9 = %d", token9 );
C++中的预定义宏

预定义宏
实例

#include <iostream>
using namespace std;

int main ()
{
    cout << "Value of __LINE__ : " << __LINE__ << endl;
    cout << "Value of __FILE__ : " << __FILE__ << endl;
    cout << "Value of __DATE__ : " << __DATE__ << endl;
    cout << "Value of __TIME__ : " << __TIME__ << endl;

    return 0;
}

结果

Value of __LINE__ : 6
Value of __FILE__ : c:\users\daichunkai\desktop\test\yiyuan1\yiyuan1\yiyuan.cpp
Value of __DATE__ : Sep 14 2017
Value of __TIME__ : 10:19:09
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值