美文网首页
#ifndef#define#endif的用法(整理)

#ifndef#define#endif的用法(整理)

作者: Rumbles | 来源:发表于2017-11-16 11:35 被阅读12次
#ifndef _TEST_H
#define _TEST_H//一般是文件名的大写
头文件结尾写上一行:
#endif

这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了。
分析:当第一次包含test.h时,由于没有定义_TEST_H,条件为真,这样就会包含(执行)#ifndef _TEST_H和#endif之间的代码,当第二次包含test.h时前面一次已经定义了_TEST_H,条件为假,#ifndef _TEST_H和#endif之间的代码也就不会再次被包含,这样就避免了重定义了。

    #ifdef 标识符 
    程序段1 
    #else 
    程序段2 
    #endif 

它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。

#ifndef 标识符 
    程序段1 
    #else 
    程序段2 
    #endif 

它的作用是:若标识符未被定义则编译程序段1,否则编译程序段2。这种形式与第一种形式的作用相反。

一般情况下,我们使用#define来定义一个常量,#define的本质是文本替换.

1、定义常量
定义常量的时候最好以小写字母k开头,让人见名知意 例如:

#define kSCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
#define kSCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height

2.定义比NSLog更高级的DLog

#define DEBUG_MODE 1
#if DEBUG_MODE
#define DLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define DLog( s, ... )
#endif

当我们在Debug项目的时候,会产生这些输出;我们发布(release)项目的时候,将#define DEBUG_MODE 1注释掉,这时候就不会产生输出了,毕竟输出也是要耗费CPU资源,降低APP运行效率,虽然影响微乎其微,但是程序员做事就是要精细嘛。这种手动配置项目的方法,熟练是用可以极大地提高开发效率。

3.定义GCD的后台线程和主线程

//后台运行
#define BACK_GCD(block) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)
//主线程运行
#define MAIN_GCD(block) dispatch_async(dispatch_get_main_queue(),block)

一个是使用dispatch_time()来创建延迟时间,另一个是使用dispatch_walltime()来创建时间。前者是取的是当前设备的时间,后者去的是挂钟的时间,也就是绝对时间,如果设备休眠了那么前者也就休眠了,而后者是是根据挂钟时间不会有当前设备的状态而左右的。下面在创建dispatch_time_t对象的时候,有一个参数是NSEC_PER_SEC,从命名只能怪我们就可以知道NSEC_PER_SEC表示什么意思,就是每秒包含多少纳秒。你可以将该值进行打印,发现NSEC_PER_SEC = 1_000_000_000。也就是一秒等于10亿纳秒。如果下方的time不乘于NSEC_PER_SEC那么就代表1纳秒的时间,也就是说此处的时间是按纳秒(nanosecond)来计算的。下方就是延迟执行的的代码,因为改代码输出结果比较简单,在此就不做过多的赘述了。需要注意的是延迟执行会在新开辟的队列中进行执行,不会阻塞新的线程。

/**
 Returns a dispatch_time delay from now.
 */
static inline dispatch_time_t dispatch_time_delay(NSTimeInterval second) {
    return dispatch_time(DISPATCH_TIME_NOW, (int64_t)(second * NSEC_PER_SEC));
}

/**
 Returns a dispatch_wall_time delay from now.
 */
static inline dispatch_time_t dispatch_walltime_delay(NSTimeInterval second) {
    return dispatch_walltime(DISPATCH_TIME_NOW, (int64_t)(second * NSEC_PER_SEC));
}

相关文章

  • #ifndef#define#endif的用法(整理)

    这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了。分析:当第一次包含test.h时,由于没有...

  • #ifndef#define#endif的用法(转)

    文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都incl...

  • $( ) 用法整理

    来源于网上的《Shell十三问-ChinaUnix精华贴整理》 file=/dir1/dir2/dir3/my.f...

  • git用法整理

    git用法整理

  • instanceof的用法整理

    java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。 instanceof通过...

  • String的用法整理

    在C++里熟练使用String的前提是:忘掉char[]。 字符串的初始化 string str(str1,int...

  • MarkDown用法整理

    一、标题 效果 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 二、列表 效果 1.无序列表 无序列表...

  • jQuery用法整理

  • Maven用法整理

    1.继承 当被继承项目与继承项目的目录结构是父子关系的时候,写法如下 被继承项目与继承项目的目录结构不是父子关系的...

  • NSDictionary用法整理

    Dictionary 简介 ObjectC同一个词典对象中可以保存多个不同类型的数据,不像Java与C只能保存声明...

网友评论

      本文标题:#ifndef#define#endif的用法(整理)

      本文链接:https://www.haomeiwen.com/subject/zkclvxtx.html