下面是最简单的常量定义的形式,和函数形式,在宏中注意我们要小心空格和运算优先级最好有括号括起来
#include <stdio.h>
#define MAX 10
#define f(a,b) a+b-1
int main(){
int i;
for(i = 0 ;i <= MAX ;i++)
{
printf("i= %d\n",i);
}
printf("--------------------\n");
printf("%d\n",f(5,6));
}
pateo@pateo-B86N53X:~/work/study$ cc macro.c -o macro
pateo@pateo-B86N53X:~/work/study$ ./macro
i= 0
i= 1
i= 2
i= 3
i= 4
i= 5
i= 6
i= 7
i= 8
i= 9
i= 10
--------------------
10
下面是针对条件编译
#ifndef IMPORT
#define IMPORT <stdio.h>
#endif
#include IMPORT
#define DEBUG
int main(){
#ifdef DEBUG
printf("%s\n" , "debug");
#else
printf("%s\n" , "not debug");
#endif
printf("%s\n" , "runing");
printf("%s\n" , "-------------------------------");
#undef DEBUG
#ifdef DEBUG
printf("%s\n" , "debug");
#elif defined DEBUG
printf("%s\n" , "defined DEBUG");
#endif
#define DEBUG
printf("%s\n" , "define DEBUG");
printf("%s\n" , "-------------------------------");
}
#include<stdio.h>
main()
{
#ifdef DEBUG
printf("yes\n");
#endif
#ifndef DEBUG
printf("no\n");
#endif
}
特殊的
#include<stdio.h>
int main()
{
printf("%s\n",__FILE__);
printf("%d\n",__LINE__);
printf("%d\n",__DATE__);
printf("%d\n",__STDC__);
printf("%d\n",__TIME__);
return 0;
}
总结
指令 用途
# 空指令,无任何效果
#i nclude 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif 结束一个#if……#else条件编译块
#error 停止编译并显示错误信息
#用法:出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。有时把这种用法的#称为字符串化运算符
#include<stdio.h>
#define PASTE(n) "liaojianguo age="#n
main()
{
printf("%s\n",PASTE(29));
}
pateo@pateo-B86N53X:~/work/study$ cc macro.c -o macro
pateo@pateo-B86N53X:~/work/study$ ./macro
liaojianguo age=29
##用法: ##运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号
#include<stdio.h>
#define NUM(a,b,c) a##b##c
main()
{
printf("%d\n",NUM(1,2,3));
}
pateo@pateo-B86N53X:~/work/study$ cc macro.c -o macro
pateo@pateo-B86N53X:~/work/study$ ./macro
123