宏定义

宏定义中 ## 和 # 的作用

喜夏-厌秋 提交于 2020-01-17 10:10:42
宏定义中 ## 和 # 的作用 转载: https://www.cnblogs.com/yinheyi/p/5971614.html 内核中有很多的宏定义,在宏定义define中经常看到两个字符串##和#,这里把它的用法做一下说明: 1. ## ##是一个连接符号,用于把参数连在一起 例如: > #define FOO(arg) my##arg 则 > FOO(abc) 相当于 myabc 2.#: 是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串 例如: > #define STRCPY(dst, src) strcpy(dst, #src) 则 > STRCPY(buff, abc) 相当于 strcpy(buff, "abc") 3.注意事项: 另外,带有#与##参数的本身也是一个宏的话,则这个宏不会会被展开 。 如: 当有'#'或'##'的时候 #define A (2) #define STR(s) #s #define CONS(a,b) int(a##e##b) printf("int max: %s\n", STR(INT_MAX)); // INT_MAX #include<climits> 这行会被展开为: printf("int max: %s\n", "INT_MAX"); printf("%s\n", CONS(A, A)); /

【编程技巧】如何使用带参数的宏 && 常用的带参数宏

前提是你 提交于 2020-01-16 11:44:42
本文使用C/C++语言进行编程(点进来都是C/C++的盆友吧 =w=) 0x00 什么是宏定义 如果还不知道宏定义的童鞋就查一下吧……点进来的应该都是学过的吧…… 0x01 带参数的宏是个什么鬼?喵喵喵? 带参数的宏不是鬼,也不是一只猫。 其实顾名思义,就是宏里有参数——没学过参数的童鞋也学一下函数吧。 下面本文正式开始: 0x02 如何使用带参数的宏 先举个栗子: 1 #define random(a, b) rand() % b + a 这是一个生成随机数的宏定义,比如说想生成 1-10000之间的随机数,就可以使用random(1, 10000)来生成。(注意:请使用srand来初始化随机数种子) 如果频繁使用随机数的话,这个宏比较有用。其特点为可以 在不影响代码可读性的前提上令代码更简洁 ,我不知道从事IT者会不会这么用,但OIer一般会这么用。 好了,扯了那么久的淡, 现在来谈谈具体的语法吧!具体语法: #define 宏名称(参数表) 宏体 这个可以根据上面的栗子多理解理解,还要去多实践实践,相信很快就会明白哒~ 0x03 常用的带参数宏(循环) 当我们需要大量写循环的时候, 可以用宏来减少代码量,又不失代码可读性。通常这两个宏是比较常用的: FOR宏(一般用于i从0开始的情况) #define FOR(i, a, b) for (int i = a;i < b;i++

21天学通C语言-学习笔记(13)

隐身守侯 提交于 2020-01-11 02:03:40
宏定义 #define 宏名 宏对象体 (宏对象) 千万不要使用C 语言关键字作为宏名。作用域为本文件中从被定义的语句开始一直到该文件结束。因此,对于常用的宏定义,一般都写在头文件中。如果需要结束该宏定义,形式:#undef 宏名 #define 宏名(参数列表) 宏函数体(宏函数) 调用表达式为:宏名(参数列表) 宏名后的左括号必须紧靠宏名。 条件编译: #ifdef 命令形式: #ifdef 标识符 程序段1 #else 程序段2 #endif 意思是如果宏定义了标识符,则执行程序段1;若没有,则执行程序段2。 #ifndef 命令形式: #ifndef 标识符 程序段1 #else 程序段2 #endif 意思是如果没有宏定义标识符,则执行程序段1;若定义了,则执行程序段2。 文件包含:#include 形式为:#include <文件名> #include “文件名” 本章学习了C 语言中预处理指令的使用。 来源: CSDN 作者: 倾_城 链接: https://blog.csdn.net/weixin_43462429/article/details/103895317

GPIO应用-LED

。_饼干妹妹 提交于 2020-01-10 15:49:30
LED 由8个发光二极管LED按照组成数字0到9的方式进行物理连接,形成LED数码管,简称LED LED的选择 需要根据实际应用的需求来决定,若只需要显示数字“0”~“9”,需要7段LED即可。 若同时需要显示小数点,则需要8段LED 8段数码管由8个发光二极管LED组成。 MCU是通过I/O引脚来控制LED某段发光二极管的亮暗,从而达到显示某个数字的目的。 控制LED亮暗 确定选用的数码管是共阴极数码管或共阳极数码管。 共阴极数码管:公共端需要接地,8段数码管的信号端高电平有效,只需要在各段加上高电平信号即可使相应的段发光。 共阳极数码管:公共端接电源阳极,8段数码管的信号端低电平有效,只需要在各段加上低电平信号即可使相应的段发光。 例如共阳极8段数码管,[hgfedcba]=[0111 1111]时,h段亮,显示为小数点;[hgfedcba]=[1100 0000]时,除h、g段均亮,显示为数字“0”或字母“O”。 单个LED只能显示一个数字或字母,实际中使用多个LED显示多个数字或字母。 电气参数 能承受的最大电流;额定电压;限流电阻;电流放大电路。 对LED编程 通过一个8位数据线的数据口来控制段。 8段数码管的公共端根据共阴或共阳接到固定的低电平或高电平,现在接到MCU的一个输出引脚(片选信号)由MCU控制,这些n个数码管合在一起称为n连排数码管。

预处理——宏定义

丶灬走出姿态 提交于 2020-01-10 01:18:49
1,预处理 预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。 C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。 本文介绍宏定义,文件包含参考:条件编译参考: 2,宏定义 在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏” 在C语言中,“宏”分为有参数和无参数两种。 3,无参宏定义 格式: #define 标识符 字符串 说明: (1)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。 (2)宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。 (3) 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束(类似全局变量的作用域规则)。 (4)宏名在源程序中若用双引号括起来,则预处理程序不对其作宏代换。 示例: #define OK 100 int main() { printf("OK"); printf("\n"); printf("OK123"); } 输出: OK OK123 (5

ios 宏定义 系统版本 判定

柔情痞子 提交于 2020-01-08 06:33:22
当需要判断iOS系统版本的时候,相信很多人都会这么干: #define SystemVersion [[UIDevice currentDevice] systemVersion].floatValue 现在告诉屌丝们一个更好的办法就是其实系统已经做了类似的宏定义,不需要我们再去定义了 在Simulator-IOS7.0/usr/include/Availability.h中已经定义了很多系统的宏: 然后使用: #ifdef __IPHONE_7_0 //iOS7的新特性代码 #endif 或者是使用: #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0 //iOS7的新特性代码 #endif(__IPHONE_OS_VERSION_MAX_ALLOWED 这个定义是在Simulator-IOS7.0/usr/include/AvailabilityInternal.h文件中) 就搞定了。 下面是一些常用的宏: // 是否5s #define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen]

#ifndef #define #endif的作用

做~自己de王妃 提交于 2020-01-04 19:09:42
#ifndef x //先测试x是否被宏定义过 #define x 程序段1blabla~ //如果x没有被宏定义过,定义x,并编译程序段 1 #endif   程序段2blabla~   //如果x已经定义过了则编译程序段2的语句,“忽视”程序段 1#ifndef 和 #endif 要一起使用,如果丢失#endif,可能会报错。总结一下:在c语言中,对同一个变量或者函数进行多次声明是不会报错的。所以如果h文件里只是进行了声明工作,即使不使用# ifndef宏定义,一个c文件多次包含同一个h文件也不会报错。 使用#ifndef可以避免下面这种错误:如果在h文件中定义了全局变量,一个c文件包含同一个h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误;如果加了#ifndef,则不会出现这种错. 来源: https://www.cnblogs.com/DuhuiliBlog/p/10239180.html

宏定义的边缘效应

偶尔善良 提交于 2020-01-01 01:24:56
# include <stdio.h> # define M(x) x*x int main ( ) { printf ( "%d" , M ( 1 + 2 ) ) ; } # include <stdio.h> # define M(x) x+2 int main ( ) { printf ( "%d" , M ( 3 ) * 2 ) ; } 如果是新手,若不小心,可能会判断错上面两段程序的输出结果吧。但又可能有人觉得是程序有问题,实际上,这叫做:宏定义的边缘效应。不过并不是一种错误。 那么,问题出在哪里呢? # include <stdio.h> # define M(x) (x)*(x) int main ( ) { printf ( "%d" , M ( 1 + 2 ) ) ; } # include <stdio.h> # define M(x) (x+2) int main ( ) { printf ( "%d" , M ( 3 ) * 2 ) ; } 它们的输出应该和一般的设想是一致的。区别在哪里?察觉到了吗? 宏定义的功能是形式的替换,而不是值的替换! # define M(x) x*x 不是说 M ( x ) 的值为x * x,而是将 ( x ) 的形式替换为x * x。 也就是说, M ( 1 + 2 ) = 1 + 2 * 1 + 2 = 1 + 2 + 1

Unity3D -- 平台宏定义

南楼画角 提交于 2019-12-31 11:24:19
官方文档网址: https://docs.unity3d.com/Manual/PlatformDependentCompilation.html Property: Function: UNITY_EDITOR Unity编辑器 UNITY_EDITOR_WIN Windows 操作系统. UNITY_EDITOR_OSX macos操作系统 UNITY_STANDALONE_OSX 专门为macos(包括Universal, PPC,Intel architectures)平台的定义 UNITY_STANDALONE_WIN 专门为windows平台的定义 UNITY_STANDALONE_LINUX 专门为Linux平台的定义 UNITY_STANDALONE 独立平台 (Mac OS X, Windows or Linux). UNITY_WII WII 游戏机平台 UNITY_IOS iOS系统平台 UNITY_IPHONE iPhone UNITY_ANDROID android系统平台 UNITY_PS4 ps4平台 UNITY_SAMSUNGTV 三星TV平台 UNITY_XBOXONE Xbox One 平台 UNITY_TIZEN Tizen 平台 UNITY_TVOS Apple TV 平台 UNITY_WSA #define directive for

C语言 宏定义练习:关键词 II 与符号

北慕城南 提交于 2019-12-30 02:52:19
题目描述 #include <stdio.h> /******************************************/ /// Write your code here, /// beginning with “#define”… /******************************************/ int main() { int x, s, n, i; scanf("%d", c n); if(s = i = 0; i < n; i++) { scanf("%d", c x); s += x; } printf("%d\n", s); return 0; } 输入 输出 样例输入 Copy 5 1 2 3 4 5 样例输出 Copy 15 代码 # include <stdio.h> /******************************************/ /// Write your code here, /// beginning with "#define"... # define c & # define if for /******************************************/ int main ( ) { int x , s , n , i ; scanf ( "%d" , c n )