带参的宏 但是宏函数只是简单的文本替换,并不支持参数的类型检查,很容易出现各种各样的BUG,举个司空见惯的例子:#include <stdio.h> #define POW(x) x*x int main(){ int x = 3;printf("%d\n",POW(++x));return 0;} 我们的本意是先将变量x进行自增以后再作为参数带入到宏体,变量x自增后是4...
假设应用版本是12.2.0。理想状态是: #defineMY_VERSION 12.2.0#if(MY_VERSION >= 12.2.0)...#elif(MY_VERSION >= 12.1.0)...#else...#endif 可现实情况是#define MY_VERSION 12.2.0这种语法并不支持,12.2.0不是一个有效宏值,不能包含点号;所以这种办法是把点号直接去掉,变成一个大数字。 #include<...
因此,让我们再考虑一下是否值得使用宏。 它们危险吗?答案是肯定的。您在宏定义中更改一个字符 - 所有消息的整个代码可能会变得完全不同。 但是,还有什么替代方案呢?写作,写作,复制+粘贴等?根据我的个人经验,除了士气低落之外,多次重写同一件事比使用宏要危险得多。 如果您在宏中写错了东西,很可能它只是无法编译...
当定义一个宏时,必须确保宏名称与左括号之间没有空白符。如果在名称后面有任何空白,那么命令就会把宏作为没有参数的宏,且从左括号开始采用替换文本。 常见的两个函数 getchar()和 putchar(),它们的宏定义在标准库头文件 stdio.h 中。它们的展开值会随着实现版本不同而有所不同,但不论何种版本,它们的定义总是...
预定义宏 前面已经介绍了2个预定义宏__LINE__和__FILE__,现在我们再介绍几个重要的预定义宏的用法:__STDC_VERSION__long 类型的整数常量,其值表示C 标准的每个版本的年份。199409 (C95)199901 (C99)201112 (C11)201710 (C17)202311 (C23)__DATE__字符串字面量,表示程序运行时的当前月份。__TIME__字...
一、宏讲解 1、宏定义 宏(Macro),是一种批量处理的称谓。计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。 2、C语言宏定义的常规用法 1) 定义符号常量 #define PI 3.1415926
宏版本 c语言标准库里面没有提供map的实现,而在实际工作中,这个数据结构是极其需要的。 其实实现一个比较简单的map数据结构不是非常难,难点在于在优雅且通用。 本文将一步一步地给出两种实现,第一种不够优雅,但也能用;第二种给出优雅的宏实现版本。
1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define 标识符替换列表 替换列表是一系列的C语言记号,包括标识符、关键字、数、字符常量、字符串字面量、运算符和标点符号。当预处理器遇到一个宏定义时,会做一个 “标识符”代表“替换列表”的记录。在文件后面的内容中,不管标识符在任何位...
下面是do-while(0)版本以及宏展开的样子: 1:#defineDO_SOMETHING_HERE(_x)do{ foo(_x); bar(_x); }while(0) 2: 3:if( condition ) 4:do{ foo(_x); bar(_x); }while(0); 5:else 6:... 定位功能 大多数编译器都通过内置的宏提供定位功能,这点在日志中尤为有效。下面是常用的宏, ...
c语言进阶篇:宏 define本质上是将文本内容在编译时进行替换,又因为他可以替换参数所以就出现了宏。 #define替换文本 语法:#define name stuff 举一个例子 #define MAX 1000 #define reg register//为 register这个关键字,创建一个简短的名字...