标识符中的...代表可变参数,args表示可变参数的名字,__LINE__是编译器内置的宏定义,表示当前行号。对于以上宏定义,如果我们传入的可变参数为空,会造成fprintf参数中多了一个逗号从而报错,为了解决这个问题,使用##表示如果可变参数为空,预处理器将去除掉它前面的那个逗号。 类似宏定义还有 #define debug(format, ....
#define outpdw(port, val) (*((volatile dword *)(port))=((dword)(val))) 19: 使用一些宏跟踪调试 ANSI标准说明了五个预定义的宏名。它们是: __LINE__ __FILE__ __DATE__ __TIME__ __STDC__ C++中还定义了 __cplusplus 如果编译器不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。
宏是通过`#define`指令来定义的。其基本语法如下:#define 宏名 替换文本 或者,对于带参数的宏(类似于函数),语法如下:#define 宏名(参数列表) 替换文本 示例 1. 定义常量宏 #define PI 3.14159 这里,`PI`是一个宏,它在预处理阶段会被替换为`3.14159`。2. 定义带参数的宏 #define SQUARE(x) ((...
当编译时定义了DEBUG宏时,调用DEBUG_PRINT会将信息输出到标准错误流中;否则,DEBUG_PRINT会被替换为空语句。 字符串处理 宏可以用于字符串的处理,比如将多个字符串连接在一起,或者将字符串转换为标识符。下面是一些示例: #define STR(x) #x // 将宏参数转换为字符串 #define CONCAT(x, y) x##y // 将两...
4. 删除宏定义指令 有时候先定义了宏,后面我又重新定义了和宏名一样的变量,会发生什么情况呢? #define N 5intN=3; 这里编译器会给变量 N 标出红色波浪线,给出错误提示:应输入标识符。 因为宏定义了 N 为 5,那么在编译器中有出现的 N 的地方都会被替换成数字 5。所以这里就变成 5=3,很显然 5 不符...
宏名有可能是类型,也有可能是函数,要看宏的定义。宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译 宏定义又称为宏代换、宏替换,简称“宏”。格式:define 标识符 字符串 其中的标识符就是所谓的符号常量,也称为“宏名”。预处理(预编译)工作也叫做宏...
C语言中,宏名没有类型,其参数也没有类型。宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。宏定义时,字符串可以是任意类型的数据。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换。
当预处理器遇到一个带参数的宏,会将定义存储起来以便后面使用。在后面的程序中,如果任何地方出现了标识符(y1,y2,…,yn)格式的宏调用(其中y1,y2,…,yn是一系列标记),预处理器会使用替换列表替代,并使用y1替换x1,y2替换x2,依此类推。 例如,假定我们定义了如下的宏: ...
ANSI标准说明了五个预定义的宏名。它们是: _LINE_ (两个下划线),对应%d _FILE_ 对应%s _DATE_ 对应%s _TIME_ 对应%s _STDC_ 宏中"#"和"##"的用法 我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. #define STR(s) #s
C语言中宏定义的使用技巧 1、概念 #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。 命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。 (1) 简单的宏定义:...