宏定义

宏定义的使用

雨燕双飞 提交于 2019-12-19 02:30:08
http://onevcat.com/2014/01/black-magic-in-macro/ 宏定义的黑魔法 - 宏菜鸟起飞手册 此上是宏定义的概要和方法,接下来列举一些经常用到的宏; 1.首次启动判断: #define First_Launched @ "firstLaunch" 2.ios7系统判断: #define IsIOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0 ? YES : NO) 3.判断是否Retina屏、是否IPhone5、是否IPad #define isRetina ([UIScreen instancesRespondToSelector: @selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO) #define iPhone5 ([UIScreen instancesRespondToSelector: @selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen]

C语言基础学习笔记——宏

两盒软妹~` 提交于 2019-12-18 14:47:22
宏定义 :#define用来定义一个标识符和一个字符串,用这个标识符替代这个字符串。 1. 不带参数的宏定义 #define 宏名 字符串 ①#表示这是一条预处理命令; ②宏名,是一个标识符,要符合标识符的命名规则,并要求大写; ③字符串的位置可以是常量、表达式、格式字符串 注意:宏定义不是语句,不需要在末尾加分号;在编写程序时,通常将所有的#define放到文件开头的位置。 #undef的作用:结束宏定义的作用域。 比如: #define TEST "This is an example" int main() { printf(TEST); #undef //之后的语句将不能再使用这个宏 return 0; } 2. 带参数的宏定义 :不是简单的字符串替换,还要进行参数替换 定义形式: #define 宏名(参数列表) 字符串 #define MIX(a,b) ((a)*(b)+(b)) //一定记得加括号,不然容易出错,因为程序在替换字符串时,系统不会加括号,运算优先级有时就会出错 #define SUM(a,b) ((a)*(b)) int main() { int sun=SUM(5+2,3+4); //若定义时不加括号就会变成5+2*3+4,结果将会出错 return 0; } 3. 条件编译的三种形式 : 第一种形式: #include<stdio.h>

Java版宏定义? 利用Gradle实现编译前-代码动态修改

只愿长相守 提交于 2019-12-18 01:44:48
apply plugin : 'com.android.application' android { ArrayList src_lines File versionPropsFile compileSdkVersion 26 buildToolsVersion "26.0.1" defaultConfig { applicationId "com.dz.gradleautochangecode" minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" versionPropsFile = file ( './src/main/java/com/dz/gradleautochangecode/MainActivity.java' ) if ( versionPropsFile . canRead ( ) ) { def stream = new BufferedReader ( new InputStreamReader ( new FileInputStream ( versionPropsFile ) , "UTF-8" ) ) def lines

浅淡C/C++中的typedef和#define

只谈情不闲聊 提交于 2019-12-17 03:04:30
在C/C++中,我们平时写程序可能经常会用到typedef关键字和#define宏 定义命令,在某些情况下使用它们会达到相同的效果,但是它们是有实质性的区别,一个是C/C++的 关键字 ,一个是C/C++的 宏定义命令 ,typedef 用来为一个已有的数据类型起一个别名,而#define是用来定义一个宏定义常量。下面谈谈两者在实际使用中应当注意的地方。 1.typedef关键字 typedef是用来声明类型别名的,在实际编写代码过程使用typedef往往是为了增加代码的可读性。它可以为一串很长的类型名起一个别名,那么使用这个别名可以达到与原类型名相同的效果。 如: typedef int INT;typedef char CHAR; 就为int和char分别起了一个别名,那么在程序中使用INT a;和int a;达到的效果是等同的。在使用typedef时应注意一下几点: 1)typedef是为一个数据类型起一个新的别名,如typedef int INT;那么要告诉我的是INT表示整型, typedef int* INTPTR ;则告诉我们INTPTR是一个指向整型变量的指针类型,这点与#define是决然不同的,#define只是作简单的字符串替换,不表达 任何含义。如: #define INTPTR1 int*typedef int* INTPTR2;INTPTR1 p1,p2

内联函数与宏定义

久未见 提交于 2019-12-17 02:54:35
内联函数与宏定义 我们知道,在调用函数的过程中是使用栈进行的调用,调用栈比较消耗内存,所以我们便想通过使用内联函数或者是宏定义来达到在减小内存的情况下进行函数调用的效果。 1.宏定义 宏定义是要先通过预处理的,优点是消耗内存小(比起栈方法调用函数宏定义是直接插入),缺点是宏定义的预处理只是简单地文本置换(可能会出现如下代码的问题)。 # include <iostream> # define SUM 3+4 using namespace std ; int main ( ) { cout << SUM * SUM << endl ; return 0 ; } 结果本应该是49,可是由于宏定义是进行的简单地进行文本替换,也就变成了 3+4*3+4 = 19 2.内联函数 想要减小内存的开销,又想避免宏定义容易出现的问题,那么内联函数就是一个不错的选择。 内联函数是在通过编译器进行判断的,加上inline 只是给编译器一个建议,让编译器考虑把该函数改成内联函数,但是如果函数本身过于复杂,就算加上了inline,编译器也不会将函数改为内联的。 放在类中的函数编译器都 默认加上inline class Base { public : //构造函数 Base ( ) { } //析构函数 ~ Base ( ) { } //声明f函数 void f ( ) { cout << "This

ZZULIOJ 1179: 带参宏定义(函数专题)

╄→гoц情女王★ 提交于 2019-12-17 01:07:42
题目描述 从键盘输入三个字符,用空格隔开,使用带参宏定义1中SWAP,将三个字符按从大到小的顺序排序输出。 宏定义1:#define SWAP(a, b, t) { t=a; a=b; b=t; } 请尝试,如果用宏定义2中的SWAP,主函数需要如何修改才能得到正确结果? 宏定义2:#define SWAP(a, b, t) t=a; a=b; b=t; 输入 输入三个字符,用空格隔开 输出 输出占一行,包含三个字符,用空格隔开 样例输入 Copy w a q 样例输出 Copy w q a 宏定义1:#define SWAP(a, b, t) { t=a; a=b; b=t; } # include <stdio.h> # define SWAP(a,b,t) {t = a;a = b;b = t;} int main ( ) { char x , y , z , t ; scanf ( "%c %c %c" , & x , & y , & z ) ; if ( x < y ) SWAP ( x , y , t ) ; //x>y if ( x < z ) SWAP ( x , z , t ) ; if ( y < z ) SWAP ( y , z , t ) ; // printf ( "%c %c %c" , x , y , z ) ; } 宏定义2:#define SWAP

keil中编程宏定义重加u的意思

安稳与你 提交于 2019-12-14 10:56:52
#define TEMP 0x01u #define TEMP1 0x02u u 就表示unsigned,ul 就表示 unsigned long型,也就是无符号的意思。常用在非符号的场景,一是为了防止编译器将它作为有符号数字进行处理,显式声明,以防万一;二是防止编译提醒符合位改变等情况。 举例:比如ox8000 这是一个16位的数,如果不加u,有的编译器认为它是个负数,然后右移这个数的时候,编译器就会提醒符号位改变,就从负数变成了正数。如果加上u,0x8000u,直接声明这是一个无符号的16位数,随便怎么移动都没事,就相当于 usigned short 。 其实这和在数字末尾加f,加l等的作用是类似的。 来源: CSDN 作者: m0_37141848 链接: https://blog.csdn.net/m0_37141848/article/details/103536276

Unity宏定义重构修改

大城市里の小女人 提交于 2019-12-14 06:13:42
using UnityEngine; public class Platformtool { public static bool IsAndroid { get { bool retValue = false; #if UNITY_ANDROID retValue = true; #endif return retValue; } } public static bool IsEditor { get { bool retValue = false; #if UNITY_EDITOR retValue = true; #endif return retValue; } } public static bool IsIOSiPhone { get { bool retValue = false; #if UNITY_IOS if ((float)Screen.width / (float)Screen.height >= 1.5f) { retValue = true; } else { retValue = false; } #endif return retValue; } } public static bool IsiOSIpad { get { bool retValue = false; #if UNITY_IOS if ((float)Screen.width /

c语言中可变参数的原理---printf()函数

杀马特。学长 韩版系。学妹 提交于 2019-12-12 12:20:25
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 函数原型: int printf(const char *format[,argument]...) 返 回 值: 成功则返回实际输出的字符数,失败返回-1. 函数说明: 在printf()函数中,format后面的参数个数不确定,且类型也不确定,这些参数都存放在栈内.调用printf()函数时,根据format里的格式("%d %f...")依次将栈里参数取出.而取出动作要用到va_arg、va_end、va_start这三个宏定义,再加上va_list. (1)va_list事实上是一char *类型,即: typedef char* va_list; (2)三个宏定义: #define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) #define va_arg(ap,type) ( *(type *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) #define va_end(ap) ( ap = (va_list)0 ) 【 attention

C++如何使用宏定义来简化代码性能测试 | cpp macro like function to implement a performance profiler

南笙酒味 提交于 2019-12-12 09:24:27
本文首发于个人博客 https://kezunlin.me/post/65dc693d/ ,欢迎阅读最新内容! cpp macro like function to implement a performance profiler Guide macro expansions name ===> quote as strings "xxx" name, name ===> xxx a ## b ===> concatenate the preceding and following tokens. // #name ===> "xxx" // name, ##name ===> xxx // ##name ===> concatenate // #name ===> quote as strings // a ## b ===> concatenate the preceding and following tokens. #define QUOTE(name) #name #define CONCAT(x,y) x##y // x ## y space in ommited #define MACRO(name) #name "foo" #define MACRO2(name) name "foo" #define MACRO3(name) ##name "foo"