宏定义

#define用法

倾然丶 夕夏残阳落幕 提交于 2019-12-04 06:29:12
宏定义 作用范围:定义行后的语句块,可以是全局变量或局部变量 本质:宏替换(在程序中使用宏名,在预处理(或预编译)时期进行内容替换) 好处: 1、提高可读性 2、对一些简单的函数进行宏定义,无需函数调用,运行效率高。 3、 可维护性好 define中的三个特殊符号 1、##。 宏定义:#define Conn(x,y) x##y x,y的连接,可以返回int/浮点类型的数据(不能连接两个浮点数),也可以连接变量 1 ... 2 3 #define ADD_TO_ax(x,val) a##x += val 4 5 int main() 6 { 7 int a1 = 0; 8 ADD_TO_ax(1, 5); 9 cout<<a1; 10 return 0; 11 } 2\\ 2、#@ 宏定义:#define ToChar(x) #@x 返回const char类型字符,x只能是单个字符,否则编译器报错或返回 最后一个字符 3、# 宏定义:#define ToString(x) #x 返回const char *类型,即“x” 注意:三种宏定义括号中的变量名全为常量,不能表示变量 1 #include <iostream> 2 using namespace std; 3 4 #define Conn(x,y) x##y 5 #define ToChar(x) #@x 6

错题

烈酒焚心 提交于 2019-12-04 03:30:15
数组名是常量不能自加 C、s[0]的地址再加一就是s[1]的地址 &s[0]+1=&s[1] #define M(x,y,z) x*y+z ​ ​M(a+b,b+c,c+a) ​ 宏展开 a+b*b+c+c+a = 12 ​如果这样声明 #define M(x,y,z) (x)*(y)+z ​ ​宏展开 (a+b)*(b+c)+ c + a = 19 ​ 就变成我们想要的结果了 ​ ​所以宏定义时候 参数别忘记加括号 AB、二维数组初始化时,第一维可以不指定数字,第二维必须指定。 C、初始化元素个数不能超过数组元素个数 D、 int a[2][3] = {{1,2,3},{4,5,6}} 来源: https://www.cnblogs.com/y4247464/p/11828933.html

c语言可变参数与宏定义

依然范特西╮ 提交于 2019-12-03 23:11:54
宏定义 https://www.cnblogs.com/wzd5230/p/10959032.html https://www.cnblogs.com/xyang0917/p/4172493.html https://blog.csdn.net/wukery/article/details/53286348 //...表示可变参数列表 #define LOG(format, args...) fprintf(stdout, format, args) LOG("%s","123"); //正确 LOG("123"); //错误 展开后,相当与LOG(,"123") #define LOG(format, args...) fprintf(stdout, format, ##args) LOG("%s","123"); //正确 LOG("123"); //正确 ##加上后不会进行连接。 ##”连接符号的用法,“##”的作用是对token进行连接,上例中format,args都可以看作是token,如果token为空,“##”则不进行连接,所以允许省略可变参数 因为format这个token为空,又因为有##的加持,所以不连接。 //生产环境与测试环境切换操作 #ifdef DEBUG #define LOG(format, ...) fprintf(stdout, ">>

当结构体遇上宏定义,以及函数指针的高级写法(结构体中能用宏定义一个函数?)

爷,独闯天下 提交于 2019-12-03 12:11:18
一、结构体中可以定义一般的宏定义 如: struct aaa { #define STATUS_1 100 #define STATUS_2 200 #define STATUS_3 300 ........ }; 首先,这里的宏定义是在预编译阶段完成的,编译器此时并不知道什么结构体,所以这些宏是全局可见的。 一个宏定义,如果写在结构体之内,即使与结构体之外的宏定义名字重复了最多是编译警告。可是如果不在结构体之内,名字重复可肯定是error。(未证实,可以做实验,而且可以把两处的宏定义成不同的值,会是什么情况?) 定义在结构体之内的宏在结构体内可以隐藏定义在结构体之外定义的宏,如果都在结构体之外定义,那么就是定义了两个相同的宏,而一个在内,一个在外,则结构体内只看到内部定义的宏,而结构体外只看到外部定义的宏,跟变量的隐藏类似。 宏的处理是在编译的预处理阶段完成的。预处理器根本就不认识什么结构体,在C语言编译器编译这个C文件中的结构体时,这个define语句已经不存在了。 相应的,用到这个宏的地方,宏本身也已经替换成宏的值(这个宏展开)。大家可以用gcc -E命令来只做预处理而不编译,看看出来后的文件。 至于为什么在结构体里头#deifne,是因为这个宏一般用于定义该结构体里头的标志位变量的可能的值,和结构体的这个变量密切相关。放在一起从逻辑上比较容易理解。 二

const 使用

北城余情 提交于 2019-12-03 01:33:52
宏定义与const的区别?(概念题是最容易丢分) 1. 发生时机不一样: 宏定义发生在预处理时,const关键字发生编译时 2. 宏定义仅仅只做了字符串的替换,没有类型检查; const关键字有类型 检查,可以提前发现错误 3. const关键字更推荐使用; 因为使用const关键字可以减小犯错误的概率 #define NUMBER 1024 void test0() {   cout << "NUMBER = " << NUMBER << endl; } void test1() {   const int number = 1;   cout << ">> number = " << number << endl;   number = 10;   //const int number2;//error, 必须要进行初始化 } void test2() {   int number = 10;   int number2 = 100;   int * p1 = &number;   cout << "*p1 = " << *p1 << endl;   cout << "&p1 = " << &p1 << endl;   const int * p2 = &number;//常量指针(pointer to const)   cout << "*p2 = " << *p2 <<

常用宏定义 - 其他

匿名 (未验证) 提交于 2019-12-03 00:41:02
/** 方正黑体简体字体定义 */ #define FONT ( F ) [ UIFont fontWithName :@ "FZHTJW--GB1-0" size : F ] /** 定义一个API */ #define APIURL @ "http://xxxxx/" /** 登录API */ #define APILogin [ APIURL stringByAppendingString :@ "Login" ] /** 设置View的tag属性 */ #define VIEWWITHTAG ( _OBJECT , _TAG ) [ _OBJECT viewWithTag : _TAG ] /** 程序的本地化,引用国际化的文件 */ #define MyLocal ( x , ...) NSLocalizedString ( x , nil ) /** 多线程GCD */ #define kDISPATCH_ONCE_BLOCK ( onceBlock ) static dispatch_once_t onceToken ; dispatch_once (& onceToken , onceBlock ); #define BACK ( block ) dispatch_async ( dispatch_get_global_queue ( DISPATCH_QUEUE

JKDataHelper升级之添加宏定义开关

匿名 (未验证) 提交于 2019-12-03 00:31:02
Class targetClass = NSClassFromString (@ "__NSArrayI" ); ... [ self JKswizzleMethod : @selector ( objectAtIndexedSubscript :) withMethod : @selector ( JKsafeObjectAtIndexedSubscript :) withClass : targetClass ]; Class targetClass = NSClassFromString (@ "__NSArrayM" ); ... [ self JKswizzleMethod : @selector ( objectAtIndexedSubscript :) withMethod : @selector ( JKsafeObjectAtIndexedSubscript :) withClass : targetClass ]; 增加了之前漏掉的两个方法,完善对 NSArray , NSMutableArray 的数据容错。 这个宏定义开关主要是在 JKDataHelperMacro.h 这个文件中 #define JKDataHelperDebug 的宏定义,如果不想使用JKDataHelper的拦截容错功能的话,可以将该宏定义注释掉,如果想使用的话

JKDataHelper升级之添加宏定义开关

匿名 (未验证) 提交于 2019-12-03 00:30:01
Class targetClass = NSClassFromString (@ "__NSArrayI" ); ... [ self JKswizzleMethod : @selector ( objectAtIndexedSubscript :) withMethod : @selector ( JKsafeObjectAtIndexedSubscript :) withClass : targetClass ]; Class targetClass = NSClassFromString (@ "__NSArrayM" ); ... [ self JKswizzleMethod : @selector ( objectAtIndexedSubscript :) withMethod : @selector ( JKsafeObjectAtIndexedSubscript :) withClass : targetClass ]; 增加了之前漏掉的两个方法,完善对 NSArray , NSMutableArray 的数据容错。 这个宏定义开关主要是在 JKDataHelperMacro.h 这个文件中 #define JKDataHelperDebug 的宏定义,如果不想使用JKDataHelper的拦截容错功能的话,可以将该宏定义注释掉,如果想使用的话

C++ 宏

匿名 (未验证) 提交于 2019-12-03 00:26:01
转载: https://blog.csdn.net/shuzfan/article/details/52860664 ―――――――― #define基本用法 ―――――――― #define命令是C语言中的一个宏定义命令,它用来将一个标识符(宏名)定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。程序编译之前,编译的时候所有的宏名都会被定义的字符串替换,这便是宏替换。 理解宏定义的关键在于 “替换” 。 该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。 (1)简单的宏定义: #define <宏名>  <字符串> 例: #define PI 3.14 程序: float pi2 = PI * 2 ; //pi2 = 6.28 1 (2) 带参数的宏定义 #define <宏名> (<参数表>) <宏体> 例: #define AddOne(x) (x+1) 程序: float pi2 = PI * 2 ; //pi2 = 6.28 pi2 = AddOne(pi2); // pi2 = 7.28 1 2 ―――――――― 宏替换发生的时机 ―――――――― 为了能够真正理解#define的作用,让我们来了解一下对C语言源程序的处理过程。当我们在一个集成的开发环境如Turbo C中将编写好的源程序进行编译时,实际经过了预处理、编译、汇编和连接几个过程