#define 用法

Qt开发之路42---Qt全局宏定义 一:在.cpp或者.h文件中宏定义 #include <QApplication> #include <QDebug> #define HMI "hmi123" int main(int argc, char *argv[]) { QApplication a(argc, argv); qDebug()<<HMI; return a.exec(); } 在.cpp文件中定义,#define HMI "hmi123" 二:在.pro 阅读详情
一般情况下,我们使用#define来定义一个常量,#define的本质是文本替换,例如#define INT_PTR int*,这时候我们使用INT_PTR,INT_PTR a,b;这条语句等价于int * a,b;也就是定义了一个指针变量a和整型变量b,这是#define常用的场景和需要注意的细节地方。下面我收集并整理了常用的#define,以后也会不断地更新。

1、定义常量

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

(1)导航栏高度:我们都知道iPhone竖屏时候导航栏的高度为44,这时候可以定义一个常量来表示该高度,

#define kNaivgationBarHeight 44

(2)屏幕的宽高:屏幕的宽高就是iOS设备硬件的屏幕尺寸,跟ViewController的view不完全相同,

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

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

2、内存管理的安全释放对象

#define SAFE_RELEASE(x) [x release];x=nil

注意结尾没有;冒号,这条语句在dealloc时候使用,例如

- (void)dealloc

{

SAFE_RELEASE(array);

[super dealloc];

}

为什么这句话表示安全释放呢?我们在使用Objective-C对象的时候,最后一定要保证它的引用计数retainCount为0,但是有时候我们也不能完全保证自己做到完美,这时候在dealloc的时候将对象设置为nil,这样就释放了该对象战友的内存区域,防止内存泄露。

3、判断iOS系统的版本

(1)当前系统版本号

#define kCurrentSystemVersion [[[UIDevice currentDevice] systemVersion] floatValue]

(2)判断是否是iOS7或更高的系统版本

#define IOS_VERSION_7_OR_LATER (([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)? (YES):(NO))

(3)当前的系统语言

#define kCurrentLanguage [[NSLocale preferredLanguages] objectAtIndex:0]

4、定义常用的颜色

有时候多个控件都需要设置同一个颜色,而UIColor的rgb写法确实浪费时间,是用宏定义常量,可以节省很多的代码,例如下面定义了紫色和暗灰,

#define kPurpleColor [UIColor colorWithRed:137.0/255 green:21.0/255 blue:89.0/255 alpha:1.0]

#define kDarkGrayColor [UIColor colorWithRed:100.0/255 green:100.0/255 blue:100.0/255 alpha:1.0]

这时候给控件定义背景色就方便多了

5、定义比NSLog更高级的DLog

NSLog方便我们暴力调试,就是输出自己观察的变量的值,是用宏定义可以将NSLog封装得更加高级,在项目的pch文件中,是用如下代码,

#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

例如在ViewController中使用DLog(@"12345");在控制台上面输出的内容如下,

2014-04-18 19:33:30.377 DefineSample[3593:70b] <0x8a68360 ViewController.m:(54)> 12345

这段信息包括字符串@"12345"的内存地址<0x8a68360>,所在的文件ViewController.m的54行,字符串内容为12345。其实看一看这些宏的定义,我们可以了解的更多系统的东西,例如__FILE__表示定位到哪个文件,__LINE__定位到哪一行。

当我们在Debug项目的时候,会产生这些输出;我们发布(release)项目的时候,将#define DEBUG_MODE 1注释掉,这时候就不会产生输出了,毕竟输出也是要耗费CPU资源,降低APP运行效率,虽然影响微乎其微,但是程序员做事就是要精细嘛。这种手动配置项目的方法,熟练是用可以极大地提高开发效率。需要注意的是这个宏只能将NSString作为参数,输出NSString的内容,对于数组、字典、UI控件以及基本类型int、float则不能作为其参数。不过可以自己去定义需要的宏,将上述的类型作为参数,也不是很困难。

6、判断是iPhone真机(Device)还是模拟器(Simulator)

#if TARGET_OS_IPHONE

//针对真机进行编码

NSLog(@"iPhone Device");

#elif TARGET_IPHONE_SIMULATOR

//针对模拟器编码

NSLog(@"iPhone Simulator");

#endif

有的时候模拟器和真机的性能不一样,所以这样可以做一个判断。上面的宏TARGET_OS_IPHONE和TARGET_IPHONE_SIMULATOR是系统定义的,可以直接是用,按住Command点击,可以看见更多的信息。

7、判断是否是ARC

//ARC

#if __has_feature(objc_arc)

//是用arc编码

#else

//是用手动内存管理

#endif

8、定义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)

9、单例化一个类

#define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) \

\

static classname *shared##classname = nil; \

\

+ (classname *)shared##classname \

{ \

@synchronized(self) \

{ \

if (shared##classname == nil) \

{ \

shared##classname = [[self alloc] init]; \

} \

} \

\

return shared##classname; \

} \

\

+ (id)allocWithZone:(NSZone *)zone \

{ \

@synchronized(self) \

{ \

if (shared##classname == nil) \

{ \

shared##classname = [super allocWithZone:zone]; \

return shared##classname; \

} \

} \

\

return nil; \

} \

\

- (id)copyWithZone:(NSZone *)zone \

{ \

return self; \

}

注意这是arc时候单例一个类的宏,另外一个注意的地方就是上面是用了'\'反斜杠,这是#define时候换行的时候要在行末加上换行,不然相当于连成一块的字符串。
【Qt】pro中使用DEFINES来实现条件编译 1、pro中使用DEFINES来实现条件编译 在Qt的pro文件中使用DEFINES 来实现类似gcc -D的条件编译功能。 如,在pro中: #定义条件编译宏LAOER DEFINES += LAOER #依赖编译宏LAOER的编译选项: contains(DEFINES, LAOER){ message(hello Laoer) } #与编译宏LAOER冲突的编译选项: !contains(... 阅读详情

相关推荐

define使用

define的使用总结。较全面。有需要的可以下载看看。

Qt中的Q_D宏和d指针

1 _ZTS7QObject 一、Q_D的在文件中的提法   Q_D的设置意在方便地获取私有类指针,文件为qglobal.h。下面的##是宏定义的连字符。假设类名是A,那么A##Private翻译过来就是APrivate。 1 #define Q_D(Class) Class##Private * const d = d_func()   d_func()函...

dimaoya9046的博客 985

数字蓝牙功放

数字蓝牙功放(TPA3110+BK8000L),基于D类数字功放芯片TPA3116蓝牙功放,HIFI级带滤波15Wx2蓝牙数字功放,支持有线和蓝牙两种音源输入

runweipa的博客 1419

11.QT #define 即宏的使用

weixin_39875396的博客 693

别再只用跳层连接了!手把手教你用DASI和MDCR模块提升红外小目标检测精度

本文详细介绍了如何利用DASI和MDCR模块提升红外小目标检测精度。通过分析传统跳层连接的缺陷,提出维度感知的特征选择性融合(DASI)和多尺度感受野精炼器(MDCR)的创新方案,显著提升小目标检测性能。实验证明,该方法在多个场景下AP@0.5提升达15.4%,特别适用于安防监控和遥感图像分析。

weixin_28715081的博客 224

沐数科技数据开发岗笔试题2025

与数据库中的主键(Primary Key)​有所不同,业务主键(Business Key)​是业务层面的唯一标识,通常由业务规则决定,例如,订单号、订单明细号,身份证号等。用户授信表(table_credit):包含用户ID(uid)、授信申请时间(credit_submit_time_local)、授信状态(credit_status)。:在正态分布中,大约68%的数据值落在距离均值一个标准差的范围内,约95%的数据值落在两个标准差的范围内,而约99.7%的数据值落在三个标准差的范围内。

weixin_40121264的博客 3525

#define 用法总结

#define的用法经常不理解,特开一个总结帖。 数据类型的替换 #define CONST(type, memclass) const type 当遇到CONST(type, memclass) 的时候,会被const type 所替代。 普通的数字替换 #define kk 10 防止重复编译 “app.h”文件中包含函数max()的定义; 此时如果,“bpp.h”文件和...

shnsxz的博客 5105

2025年第十六届蓝桥杯省赛C/C++大学B组 个人题解

也是写了写部分题解,朱波也是狠狠水了个省二┭┮﹏┭┮,毕竟许多算法知识没怎么学。

2301_80173664的博客 2431

c++中#define的用法

今天整理了一些#define的用法,与大家共享! 1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写 if(i<MAXTIME){…} 编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。 这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替...

CSer 1万+

加法器设计—— 原理图与VHDL设计初步

1、在DE2-115开发板上,完成4位全加器系统的设计、下载和功能演示,并在FPGA上实现1位全加器;2、完成3-8译码器的设计、下载和功能演示(利用板上的8段数码管)本次实验在组合逻辑电路的基础上,运用Verilog编程实现了四位全加器和3-8译码器的设计,同时实现了在DE2-115开发板上的下载和功能演示。整个过程加深了我对电路设计和Verilog编程的理解,同时也锻炼了解决问题的能力。

m0_74749526的博客 1237

C++坦克大战源代码

【代码】C++坦克大战源代码。

强国豪,林中霖 2609

C语言之#define用法入门详解

在C语言中,常量是使用频率很高的一个量。常量是指在程序运行过程中,其值不能被改变的量。常量常使用#define来定义。 使用#define定义的常量也称为符号常量,可以提高程序的运行效率。

sunnyoldboy博客 4万+

C#里使用NModbus来创建一个TCP从站服务

摘要:本文介绍了一个用C#实现的Modbus TCP从站服务器,基于.NET Framework 4.6.1开发。代码使用NModbus库创建TcpListener和ModbusSlaveNetwork,支持设置IP地址、端口号和从站ID。服务器实现了数据存储初始化功能(包括线圈和保持寄存器),并提供了启动/停止操作的UI界面和日志记录功能。该解决方案适用于需要调试Modbus TCP协议的场景,特别适合无法升级到更高版本.NET Framework的环境。

大坡3D软件开发 478

#define后接{}的用法

在学校做比赛,查找寻迹小车的资料,看到了一篇51开发的小车文章,那个博主的程序中写到#defineleft_go{Left_Motor_P1=1;Left_Motor_P2=0;}#defineleft_back{Left_Motor_P1=0;Left_Motor_P2=1;}#defineleft_stop{Left_Motor_P1=1;Left_Mo...

qq_37770662的博客 4254

Hermes Agent 桌面版安装部署完全指南:一步步安装自进化Agent智能体

是由开发的开源自主 AI 智能体(MIT 协议)。它不是绑定在集成编辑器上的编码助手,也不是围绕单一 API 的聊天机器人封装——它是一个越用越强大的自主智能体,拥有独一无二的闭环学习系统特性说明自主技能创建在复杂任务后自动生成可复用的 Skills(技能)技能自我改进使用过程中持续优化已有技能持久化记忆跨会话记住你的项目、偏好和解决方案用户画像建模通过 Honcho 方言式推理,逐步构建对你的深度理解20+ 平台接入。

大模型与Agent智能体 7765

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++中 #define的用法

http://blog.youkuaiyun.com/lyl_98/article/details/900158 C++中 #define的用法    转自:http://www.dingge.com/main/article.asp?id=10 今天整理了一些#define的用法,与大家共享! 1.简单的define定义 #define MAXTIME 1000 一个简

Gabby 3198

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

#define的用法

[c语言] #define的用法 #define的用法 转自http://blog.youkuaiyun.com/djsl6071/archive/2007/04/02/1549539.aspx 1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写 if(i 编译器在处理这个代码之前会对MAXTIME进行处

zuihoudebingwen的专栏 549

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

#define和typedef的用法,及其区别

/ 相当于 union { int i;// p1 和 p2 都是 Point 类型的指针。这个c是char*类型的,d只是单纯的unsigned char的变量。// 相当于 int arr[10];大部分时候#define就是单纯的替换,将自己于后面内容替换。// 相当于 int* ptr;你可以为函数指针类型定义别名,使得函数指针的声明更加简洁。结构体的指针)的别名。的别名,相当于定义了一个固定大小的整数数组。是结构体类型的别名,表示一个包含。这两个a,b都是char*类型的。

weixin_50127894的博客 1031

typedef和#define的用法与区别

文章目录1. typedef的用法2. #define的用法3. typedef与#define的区别4. typedef的四个用途① 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象② 用在旧的C代码中(具体多旧没有查),帮助struct③ 用来定义与平台无关的类型④ 为复杂的声明定义一个新的简单的别名5. typedef的两个陷阱① typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换② typedef在语法上是一个存储类的关键字(与auto、extern、

To the beyond and infinity! 897

#define用法集锦

Definition: The #define Directive   You can use the #define directive to give a meaningful name to a constant in your program. The two forms of the syntax are:   Syntax   #define identifier token-...

weixin_34191845的博客 1120

#define的用法归类

#define的用法归类常规用法不再介绍,做如下几点说明和介绍1. 带参数的宏只完成简单字符替换,之前不做计算实参的工作,如下 #define SUM(x,y) x+yint a=3,b=2,c=1;int s;s=SUM(a+b,b)*SUM(c,b)+c;             结果应该是 s=a+b+b*c+b+c=10。2. define中的特殊标

beitcoder的专栏 769

#ifndef与#define的用法

ifndef与define的用法 define的用法 define是C/C++中的宏定义,常用#define来定义常量。 如:#define PI 3.14 ifndef的用法 ifndef的用法在于避免重复包含和编译,在同一头文件被多次引用且又同时编译时,容易出现声明冲突。 两者通常同时使用 如: #ifndef xxxx #define xxxx xxxx … xxxx #endif 第一行ifndef回首先判断是否已经定义,如果已经定义将直接跳到#endif,否则将执行#define命令。 ...

qq_39064869的博客 4364
上一篇: iOS开发~CocoaPods使用详细说明
下一篇: ios 中pch 文件里面的预编译命令符
LWZDeveloper
博客等级 码龄12年 4粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值