首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言 宏嵌套的展开规则

第一时间看干货文章 1 C语言中,宏是在预编译时用宏体内容“文本替换”代码中的宏名的。...先讲一些宏嵌套的展开规则: 一般的展开规律像函数的参数一样:先展开参数,再分析函数,即由内向外展开; 当宏中有#运算符的时候,不展开参数; 当宏中有##运算符的时候,先展开函数,再分析参数; ##运算符用于将参数连接到一起...a_PARAM(INT_1)) -> 展开 TO_STRING1:"a_PARAM(INT_1)" 注意:嵌套宏的展开规则与编译器有关,不同的编译器可能对同一个嵌套宏展开不同。...原文:https://zhuanlan.zhihu.com/p/344240420 本文整理自网络,版权归原作者所有,如有侵权,请联系删除。...往期推荐 分享一个开源的QT的串口示波器 C语言回调函数,提升C技巧必备 用C语言实现状态机设计模式 stm32可以跑Linux操作系统吗?

1.6K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C语言中的宏定义

    虽然简单的宏常用于定义常量名,但是它们还有其他应用。 4) 、可以对C语法做小的修改。实际上,我们可以通过定义宏的方式给C语言符号添加别名,从而改变C语言的语法。...下面的例子是一个更复杂的宏: #define TOUPPER(c)('a'c)&&(c)c)-'a'+'A':(c)) 这个宏检测一个字符c是否在'a'与'z'之间。...如果在的话,这个宏会用'c'减去'a'再加上'A',来计算出c所对应的大写字母。如果c不在这个范围,就保留原来的c。...除了实际参数的类型和返回值的类型之外,这些函数都一样。因此,这样定义每一个函数似乎是个很蠢的做法。 解决的办法是定义一个宏,并使它展开后成为max函数的定义。...) do{a+b;a++;}while(0) 例如: if(addr) DUMP_WRITE(addr,nr); else do_somethong_else(); //宏展开以后变成这样

    6.5K10

    C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)

    一、#define的基本语法 在C语言中,常量是使用频率很高的一个量。常量是指在程序运行过程中,其值不能被改变的量。常量常使用#define来定义。...宏是一种将一系列命令组织在一起,作为一个单独命令来完成特定任务的方式。在编译语言中,宏展开是在编译时进行的,编译器会自动将宏替换为一系列指令。宏展开器是用于执行宏展开的工具。...0; } 五、带有副作用的宏参数​ 当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。...但是对于宏,不能出现递归。​ 2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。​ 七、宏与函数的对比​ 宏通常被应用于执行简单的运算。...每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。 2. 宏是没法调试的。 3. 宏由于类型无关,也就不够严谨。 4.

    99310

    C中的预编译宏定义

    比如: 你可以将一个宏扩展为与C语法格格不入的内容, 但该内容与后面的语句结合在一个若能生成合法的C语句, 也是可以正确编译的....应该避免重新定义函数宏, 不管是在预处理命令中还是C语句中, 最好对某个对象只有单一的定义. 在gcc中, 若宏出现了重定义, gcc会给出警告....#if 0 {     一大段代码; } #endif 常量表达式可以是包含宏, 算术运算, 逻辑运算等等的合法C常量表达式, 如果常量表达式为一个未定义的宏, 那么它的值被视为0....可参考cpp手册进一步了解#include_next 6, 预定义宏 标准C中定义了一些对象宏, 这些宏的名称以...下面列出一些标准C中常见的预定义对象宏(其中也包含gcc自己定义的一些预定义宏: __LINE__             当前语句所在的行号,

    2.9K40

    简述C语言宏定义的使用

    1 概述 在工程规模较小,不是很复杂,与硬件结合紧密,要求移植性的时候,可采用宏定义简化编程,增强程序可读性。 当宏作为常量使用时,C程序员习惯在名字中只使用大写字母。...我们仅需要改变一个宏定义,就可以改变整个程序中出现的所有该常量的值; 可以帮助避免前后不一致或键盘输入错误; 控制条件编译; 可以对C语法做小的修改; 带参数的宏 带参数的仍要遵循上述规则,区别只是宏名后面紧跟的圆括号中放置了参数...#define 宏名>() 宏体> 注意参数列表中的参数必须是有效的c标识符,同时以,分隔 算符优先级问题: #define COUNT(M) M*M int x=5; print(COUNT...,但是C++/C程序员不要定义很复杂的宏,宏定义应该简单而清晰。...((c) – 0×20) : (c)) 判断字符是不是10进制的数字 #define DECCHK(c) ((c)>='0' && (c)<='9') 判断字符是不是16进制的数字 #define

    1.6K20

    c语言之带参数的宏定义

    1.带参数的宏定义中,宏名和新参表之间不能有空格, 2.在带参数的宏定义中,形参参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体值,要用它去代换形参,因此必须作类型说明。...2; y = 3; max = MAX(x,y); printf("%d\n", max); system("pause"); return 0; } 3.在宏定义中的形参是标识符...4.在宏定义中,字符串内的形参通常要用括号括起来以避免出错。 5.带参的宏和代餐函数类似,但本质不同,除此之外,把同一表达式用函数处理和用宏处理两者的结果有可能不同。...这是因为普通函数调用时,实参传给形参的是值,而在宏定义时,要用表达式进行替换,即(i++)*(i++),所以I++会被执行两次。...6.宏定义也可以用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。

    2.5K20

    C++中的栈展开:实现机制及其目的

    栈展开是指在异常被抛出后,C++运行时系统会自动销毁抛出异常的函数以及其他所有尚未完成的函数的栈帧。这样,所有在栈上分配的资源都会被正确释放。...然而,由于栈展开,s会在控制流跳到异常处理代码之前被正确销毁。在底层,栈展开由C++运行时系统实现。当抛出一个异常时,运行时系统会查看栈上的所有栈帧。...总的来说,栈展开是C++异常处理的重要组成部分,它保证了在异常抛出时,所有的资源都能被正确地释放。虽然这个过程在底层自动进行,但了解其工作原理对于编写健壮的C++代码是非常有帮助的。...性能开销:异常处理和栈展开会带来一定的性能开销,因此在性能敏感的代码中应谨慎使用异常。总结栈展开是C++异常处理机制中的一个关键过程,用于在异常抛出后正确释放资源。...理解栈展开的工作原理有助于编写健壮和可靠的C++代码,确保资源管理和异常处理的正确性。通过使用RAII模式和确保析构函数不抛出异常,可以有效地管理资源并避免潜在的问题。

    36110

    C++工程中常用的宏定义(#define)

    参考链接: C++ vsnprintf() 尽管说define有很多不足之处,很多时候我们需要使用const来替代define, 也可以使用typedef来替代define。 ...但是,在一些实际工程中,我们还是不可避免的使用到了define,这给我们带来了极大的方便。 ...1 定义头文件,防止重复包含  其实不是真正的防止重复包含头文件,而是忽略除了第一次之外的其他包含:  http://blog.csdn.net/wangshubo1989/article/details...WANGSHUBO_SELF_MSG WM_USER + 29 static const std::string kDate = "2016-11-25";  3 分平台实现  对于一些快平台开发,完全可以使用define来包含不同的文件...,或是实现不同的功能:  #if (MY_PLATFORM == MY_PLATFORM_WIN32) #include #include "sakura/win32/compact/dirent.h

    1.9K20
    领券