C | Macro

转自:http://www.geeksforgeeks.org/write-a-c-macro-printx-which-prints-x/

http://www.geeksforgeeks.org/interesting-facts-preprocessors-c/

Macro是在preprocessor时的字符串替换,一切与compiler无关,缺点是当你debug的时候你会觉得莫名其妙。因为compiler看不到macro。

例子1. 首先看一个最普通的Macro

#include<stdio.h>
#define max 100
int main()
{
     printf ( "max is %d" , max);
     return 0;
}
// Output: max is 100
// Note that the max inside "" is not replaced
这里的max相当于直接把100拿过来。

例子2. macro函数
#include <stdio.h>
#define INCREMENT(x) ++x
int main()
{
     char *ptr = "GeeksQuiz" ;
     int x = 10;
     printf ( "%s  " , INCREMENT(ptr));
     printf ( "%d" , INCREMENT(x));
     return 0;
}
// Output: eeksQuiz 11
这个跟上面的理解一样,就是把括号里面的东西拿出来,在前面放一个++.

例子3. token##,用来连接参数
#include <stdio.h>
#define merge(a, b) a##b
int main()
{
     printf ( "%d " , merge(12, 34));
}
// Output: 1234

这里面相当于把12,34做字符串链接,然后原封不动的返回1234,不管类型。比如下面:
#include <stdio.h>
#define merge(a, b) a##b
int main()
{
     printf ( "%d " , merge(ab, 12));//报错,因为没有变量ab12,如果在前面定义int ab12 = 5;则会输出5;
}
// Output: 1234

例子4. token #用来转换成字符串
#include <stdio.h>
#define get(a) #a
int main()
{
     // GeeksQuiz is changed to "GeeksQuiz"
     printf ( "%s" , get(GeeksQuiz));
}
// Output: GeeksQuiz
这个里面直接输出GeeksQuiz。
但是如果这样改
#include <stdio.h>
#define get(a) "a"
int main()
{
     // GeeksQuiz is changed to "GeeksQuiz"
     printf ( "%s" , get(GeeksQuiz));
}
// Output: GeeksQuiz
这样无论传入什么参数给get,都只会输出"a",因为" "里面的内容是被当作字符串处理,不会替换

例子5.macro换行的时候用\代替
#include <stdio.h>
#define PRINT(i, limit) while (i < limit) \
                         { \
                             printf ( "GeeksQuiz " ); \
                             i++; \
                         }
int main()
{
     int i = 0;
     PRINT(i, 3);
     return 0;
}
// Output: GeeksQuiz  GeeksQuiz  GeeksQuiz

例子6. 一些系统自带的Macro
11) There are some standard macros which can be used to print program file (__FILE__), Date of compilation (__DATE__), Time of compilation (__TIME__) and Line Number in C code (__LINE__)

例子7
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值