示例
main.m
#import <Foundation/Foundation.h>
// 所有的宏定义可以写在一个单独的头文件(xxx.h)中,然后使用#import "xxx.h"导入使用。
// 宏命名方式: 1 全用大写字母 2 用小写字母k开头,后面的单词用驼峰式命名
// 预处理程序
#define TWO_PI 2.0 * PI
#define PI 3.141592654
#define SQUARE(x) ((x) * (x))
//#define MAX(a,b) ( ((a) > (b)) ? (a) : (b) )
// 定义一个用来判断是否为润年的宏,用反斜线换行。
// #define IS_LEAP_YEAR year % 4 == 0 && year % 100 != 0 \
// || year % 400 == 0
// 更合理的方式是定义一个方法宏
#define IS_LEAP_YEAR(y) y % 4 == 0 && y % 100 != 0 \
|| y % 400 == 0
// 条件编译
// #ifdef、#endif、#else、#ifndef、#elif语句
//#define IPAD 1
//或者无需定义值
#define IPAD
#ifdef IPAD
// 允许在#号后放一个或多个空格
# define kImageFile @"barnHD.png"
#else
# define kImageFile @"barn.png"
#endif
//用命令行编译时与可以定义宏
//-D必须在程序名称之前输入
//例如 clang -fobjc -arc -D IPAD program.m -
int main(int argc, const char * argv[]) {
@autoreleasepool {
int v = 10;
//int y = ((v+1) * (v+1));
int y = SQUARE(v+1);
NSLog(@"y=%i", y);
int year = 2020;
if (IS_LEAP_YEAR (year)) {
NSLog(@"%i is leap year", year);
}else{
NSLog(@"%i is not leap year", year);
}
// 条件编译
NSLog(@"kImageFile: %@", kImageFile);
// 下面两种方式的宏判断作用相同
#if defined (DEBUG)
NSLog(@"debug mode ...");
#endif
#ifdef DEBUG
NSLog(@"debug mode ...");
#endif
//
#if !defined (DEBUG)
NSLog(@"!debug mode ...");
#endif
//判断如果定义了DEBUG宏,且值为非0
#if defined (DEBUG) && DEBUG
NSLog(@"debug mode !0 ...");
#endif
//利用宏注释代码块
#if 0
NSLog(@"注释掉的代码块");
#endif
//消除IPAD宏的定义
#undef IPAD
}
return 0;
}