#define outpdw(port, val) (*((volatile dword *)(port))=((dword)(val))) 19: 使用一些宏跟踪调试 ANSI标准说明了五个预定义的宏名。它们是: __LINE__ __FILE__ __DATE__ __TIME__ __STDC__ C++中还定义了 __cplusplus 如果编译器不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。
在上例中,MUL携带有两个参数x和y,当使用此宏时,只需将传入宏的两个参数直接的相乘即可。 那宏的参数是否支持表达式呢,答案是支持的,但由于宏只是简单的展开替换,因此我们就遇到了宏第一个容易出错的点 int ret = MUL(2 + 3, 4); 我们的本意是先计算出2加3的和,然后与4相乘,结果为20。但实际上该宏...
用宏来写SWAP #include<stdio.h>#define ADD(a,b) a+b#define SWAP(a,b) {int t = a; a = b; b = t;}intmain(){intx=1;inty=2;SWAP(x,y);//预处理模块把它变成{int t = a; a = b; b = t;}printf("x = %d, y = %d\n",x,y);//x = 2, y = 1, 可以交换了//这里...
1 内置的宏定义 这些宏在代码中可直接调用。 示例代码 cout << "程序最后编译日期宏 " << __DATE__ << endl; cout << "程序最后编译时间宏 " << __TIME__ << endl; cout << "当前行数宏 " << __LINE__ << endl; cout << "当前运行文件名宏 " << __FILE__ << endl; cout << "...
简单的宏定义有如下格式: [#define指令(简单的宏)] #define 标识符替换列表 替换列表是一系列的C语言记号,包括标识符、关键字、数、字符常量、字符串字面量、运算符和标点符号。当预处理器遇到一个宏定义时,会做一个 “标识符”代表“替换列表”的记录。在文件后面的内容中,不管标识符在任何位置出现,预处理器...
空的宏的作用是预留下以后平台移植时的其它选项的定义,是为了移植的方便。 跟条件编译一起用:#define GOOD ; #ifdef GOOD eg1:当替代文本为空,常用于条件编译: #define DEBUG // 替代文本:空 ... #ifdef DEBUG ... #ifndef DEBUG ... 2.1.1 宏命名规则: ...
宏(macro)是基于#define所实现的另一种预处理功能。 与基本的#define定义的是常量相比,宏(macro)允许多个参数化替换,参数中可以是固定的字符串,也被一些变量所替代。这个替换的操作将在预编译的时候完成。 宏(macro)的作用是用比较简单的方式表示复杂的函数调用,以提高程序的可读性。
#define 创建一个宏,该宏是标识符或参数化标识符与标记字符串的关联。在定义宏之后,编译器可用标记字符串替换源文件中标识符的每个匹配项。 语法 #define 标识符令牌字符串选择 #define 标识符(标识符选择,...,标识符选择)令牌字符串选择 注解 #define 指令使编译器用 token-string 替换源文件中 identifier 的...
(转)C宏技巧汇总 C宏 1,防止一个头文件被重复包含 #ifndef BODYDEF_H #define BODYDEF_H //头文件内容 #endif 2,得到指定地址上的一个字节或字 #define MEM_B( x ) ( *( (byte *) (x) ) ) #define MEM_W( x ) ( *( (word *) (x) ) ) ...
SEARCH(i, some_array, m); 第二种编写复杂宏的方式是语句表达式,例如我们可以将上述代码改成: 这两种形式的区别是,复合语句表达式可以作为右值,给另一个变量赋值。而do...while(0)不可以。