宏:
语法:
#define 宏名 要替换的内容
注意:不需要加分号,加了分号,它会把分号当做要替换的内容
作用:就是在编译的时候把用到这个宏的地方,替换成之前定义的“要替换的内容”
有参数的宏:
语法:
#define 宏名(参数列表) 要替换的内容
例:#define GETSUM(a,b) a + b
有参数的宏可以传任意东西,你传过来是什么,参数就是什么。但是替换时要保证没有语法错误
注意:参数的括号和宏名之间一定不要加空格
例:#define GETSUM (a,b) a + b 是错误的
如果要可变参数的宏呢? (记住这样子写法,以后配置全局文件时可能会用到一次)
用...搭配 ##__VA_ARGS__
例:
#define LOG(format,...) printf(format,##__VA_ARGS__)
条件编译命令:
所有的条件编译命令结尾都要加#endif
有三种:
#if-#elif-#else-#endif
#ifdef-#endif
#ifndef-#endif
条件编译的意思:有选择的编译或者不编译某段代码
#if 条件编译:就是判断右边的表达式是否为真(只能用宏,或者直接写数据)
#ifdef 宏名
代码块1
#endif
语义:如果定义了宏名,那么编译代码块1,否则不编译代码块1
#ifdef 宏名
代码块1
#else
代码块2
#endif
语义:如果定义了宏名,那么编译代码块1,否则编译代码块2
#ifndef 宏名
代码块1
#endif
语义:如果没有定义这个宏名,那么编译代码块1,否则不编译代码块1
#ifndef 宏名
代码块1
#else
代码块2
#endif
语义:如果没有定义这个宏名,那么编译代码块1,否则编译代码块2
*/
#include <stdio.h>
#define MYNUM 10
#define GETSUM(a,b) a + b
#define LOG(format,...) printf(format,##__VA_ARGS__)
int main(int argc, const char * argv[]) {
//复习宏、有参宏、可变参数宏
/*
LOG("今天天气还行\n"); //替换成 printf("今天天气还行");
LOG("小苍今年%d岁\n",40);//替换成 printf("小苍今年%d岁",40);
LOG("小苍今年%d岁,身高%d米\n",40,165);//替换成 printf("小苍今年%d岁,身高%d米",40,165);
// printf("%d\n",MYNUM); //替换成 printf("%d\n",10);
// int nums[MYNUM]; //会替换成 int nums[10];
//
// int len = 5;
//
// int nums2[MYNUM] = {10,20}; //这是替换成 int nums2[10] = {10,20};
*/
int num = 10;
//#if-#endif
/*
#define MY_DEBUG 1
#if MY_DEBUG == 1
printf("此乃调试阶段\n");
#else
printf("这是正式发行阶段\n");
#endif
*/
#ifdef MYCO
printf("定义了宏\n");
#else
printf("没有定义宏\n"); //编译这句
#endif
#ifndef MYCO
printf("没有定义\n"); //编译这句
#else
printf("有定义\n");
#endif
#define MYTEST
#ifdef MYTEST
printf("有MYTEST这个宏\n"); //编译这句
#else
printf("没有MYTEST\n");
#endif
return 0;
}
|
|