IOS基础之宏定义

宏定义#define:
定义和使用同C

/ :表示换行
# :字符串操作符,用于将参数序列化成一个字符串;
## :连接符,用于将相邻的两个标记(Token)连接为一个。使用是分隔(根据空格或其他操作分隔符[+,-,*,/,”,”等]),再强制连接(去掉和前面的字符串间的空格,再连接起来)。
@# :字符化操作符,只能用于有参数传入的宏定义中,必须置于宏定义体参数名前,作用是将传入的单字符参数名转换成字符,以一对单引号括起来。
可变参数宏:#define DBGMSG(format, ...) fprintf (stderr, format, __VA_ARGS__)
… 表示一个可变化的参数表,变参必须放于最后一个参数;
__VA_ARGS__:参数标识符。调用时会替代函数形参里的最后一个变参;
#pragma:说明编译器信息
_Pragma:同#pragma,但功能更强大;
#warning:显示编译警告信息
#error:显示编译错误信息
#line:标志该语言的行号
【可变参数宏不被ANSI/ISO C++所支持,iOS支持】

C语言中预定义宏:
__FILE__ :当前源代码的文件名(字符串)
__LINE__:当前源代码中的行号(整型)
__DATE__:进行预处理的日期(”Mmm dd yyyy”形式的字符串)
__TIME__:源文件编译时间(格式“hh:mm:ss”)
__FUNCTION__:同__func__(但IDE不支持),当前源代码的函数名
__PRETTY_FUNCTION__:同__FUNCITON__,但在g++下会输类名、函数名及其他函数信息
例:

#ifdef __OBJC__ //表示下面定义的宏内容只被使用Oc语言的文件所引用 
#ifdef DEBUG
//debug环境,在调用NSLog后,自动将参数拼接后再使用系统的NSLog打印
#define NSLog(str, ...)  NSLog(@"%s(%d): " str, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#define NSLog(...) {}//正式环境,调用到NSLog后,不做操作
#endif
#define BLOCK_EXEC(block, ...) if (block) { block(__VA_ARGS__); };
//在执行block前判空,若一个空的block执行,会出现EXEC_BAD_ACCESS异常

宏定义(define)与常量(const)的使用:

宏定义:#define NAME @“fansion” //只在预处理里做文本替换,没有类型,不做类型检查。大量使用宏会导致二进制文件变大

变量:NSString *NAME = @“fansion”;//共享一块内存空间,若项目中N处用到,也不会分配N块内存空间,可被修改,在编译阶段会检查类型

常量:(四种方式)\共享一块内存空间

局部常量:static const NSString *NAME = @“fansion”;//用static修饰后外部不能访问

全局常量:不管在哪个文件夹,外部都能访问;
const NSString *NAME = @“fansion”;//*NAME不能被修改,NAME可以
NSString const *NAME = @“fansion”;//*NAME不能被修改,NAME可以
NSString *const NAME = @“fansion”;//*NAME能被修改,NAME不可以
const位置不同,代表的意义不同;const只修饰右边的内容,即右边的内容不能被修改。

【可认为*是一个分界,把一个声明从右向左读。如:const char *p即:p is a pointer to a const char(常量字符);char * const p即:p is a const pointer(常量指针) to a char】

博客地址:IOS基础之宏定义

你可能感兴趣的:(IOS基础之宏定义)