常用宏定义__替换
C语言宏定义技巧

C语言宏定义技巧C语言中的宏定义是预处理指令之一,用来替换或扩展代码中的标识符。
宏定义是C语言中一种非常有用的技巧,可以简化代码,提高代码的可读性和可维护性。
下面是一些常用的宏定义技巧。
1. 定义常量:可以使用宏定义来定义常量,提高代码的可读性。
例如,可以使用下面的宏定义来定义一个pi常量:``````这样,每次在代码中需要使用pi的时候就可以直接使用宏定义名称来代替。
2.定义函数:宏定义还可以用来定义函数。
虽然宏定义的语法和函数的语法不同,但是宏定义在代码中起到的作用和函数很相似。
例如,可以使用下面的宏定义来定义一个求平方的函数:```#define SQUARE(x) (x)*(x)```这样,每次在代码中需要求一个数的平方的时候,可以使用SQUARE 宏来代替函数调用。
3.简化代码:宏定义可以用来简化代码,减少代码的重复性。
例如,可以使用下面的宏定义来简化代码中的计算公式:```#define AREA(length, width) (length)*(width)```这样,每次计算面积的时候,可以使用AREA宏来代替计算公式,提高代码的可读性和简洁性。
4.调试信息:宏定义还可以用来输出调试信息,方便调试程序。
例如,可以使用下面的宏定义来打印调试信息:```#define DEBUG_MSG(msg) printf("%s\n", msg)```这样,每次需要输出调试信息的时候,可以使用DEBUG_MSG宏来代替printf语句。
5.条件编译:宏定义还可以用来实现条件编译,根据不同的条件选择不同的代码。
例如,可以使用下面的宏定义来实现条件编译:```#define ENABLE_FEATURE_A#ifdef ENABLE_FEATURE_A//执行特性A的代码#else//执行其他代码#endif```这样,根据是否定义了ENABLE_FEATURE_A宏,可以选择执行不同的代码。
C语言常用宏定义的用法介绍

C语言常用宏定义的用法介绍C语言常用宏定义的用法介绍C语言中的宏定义是最常用的组成部分之一,他们在编程时有重要作用,正确应用可以减少很多代码工作量,但是使用过渡,则会造成可读性降低。
下面店铺给大家介绍C语言常用宏定义的用法介绍,欢迎阅读!C语言常用宏定义的用法介绍对于宏定义,需要注意以下说明:(1)宏名一般用大写;(2)使用宏可以提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改;(3)预处理是在编译之前的处理,预处理不做语法检查;(4)宏定义末尾没有分号;//不加;(5)宏定义自然作用域为从定义开始一直到本文件结尾;(6)可以用#undef命令提前终止宏定义的自然作用域;(7)宏定义可以嵌套;(8)字符串“”中永远不包含宏;(9)宏定义不会分配内存,变量定义分配内存;(10)宏定义不存在类型问题,它的参数也是无类型的,它仅仅是替换;(11)宏定义可以带参数,但需要注意的'是每个参数是一个整体,在定义体中要注意括起来。
下面列举了一些非常常用的宏定义用法:常数定义#define PI 3.1415926防止重复包含#ifndef __MY_HEAD_H__#define __MY_HEAD_H__...//这里的内容可以保证不被重复包含#endif求最大最小值#define GET_MAX(x, y) (((x) >= (y)) ? (x) : (y))#define GET_MIN(x, y) (((x) <= (y)) ? (x) : (y))得到结构体成员的偏移#define FPOS(type, field) ((unsigned long)&((type *)0)->field) 拼接字节为字#define MAKEWORD(h, l) (((h)<<8) | (l))#define MAKEDWORD(h, l) (((h)<<16) | (l))获得高、地位字节或者字#define WORD_LO(w) ((unsigned char)((w) & 0xFF))#define WORD_HI(w) ((unsigned char)((w) >> 8))#define DWORD_LO(dw) ((unsigned short)((dw) & 0xFFFF)) #define DWORD_HI(dw) ((unsigned short)((dw) >> 16))将一个字母转换为大写#define UPCASE(c) (((c) >= 'a' && (c) <= 'z') ? ((c) – 0x20) : (c))判断字符是不是10进值的数字#define DECCHK(c) ((c) >= '0' && (c) <= '9')判断字符是不是16进值的数字#define HEXCHK(c) (((c) >= '0' && (c) <= '9') || ((c) >= 'A' && (c) <= 'F') || ((c) >= 'a' && (c) <= 'f'))返回数组元素的个数#define ARR_SIZE(a) (sizeof((a))/sizeof(((a)[0])))【C语言常用宏定义的用法介绍】。
c语言宏定义的符号用法

c语言宏定义的符号用法在C语言中,宏定义是一种非常有用的预处理指令,它允许我们在编译时对代码进行替换。
宏定义可以帮助我们简化代码,提高代码的可读性和可维护性。
然而,正确地使用宏定义需要了解一些符号用法,下面我们将详细介绍这些符号用法。
一、宏定义的基本语法在C语言中,宏定义的一般语法如下:```c#define宏名(参数列表)替换文本```其中,宏名是用户自定义的名称,参数列表是可选的,用于指定宏的参数。
替换文本是在编译时将被替换为实际代码的文本。
二、符号用法1.宏展开与预处理指令的位置:宏定义通常位于源代码的顶部,例如在头文件中或在主程序文件的开头。
在预处理阶段,宏将被替换为实际的代码。
因此,在使用宏之前,需要确保宏的定义在代码中是可见的。
2.宏参数的使用:宏参数可以是任何有效的C语言表达式,包括变量、常量、函数调用等。
在使用宏时,需要将参数用括号括起来,以确保参数的求值顺序正确。
此外,需要确保参数的类型与替换文本的类型匹配。
3.宏的嵌套:宏可以嵌套定义,即在宏内部定义另一个宏。
这种用法可以提高代码的可读性和可维护性。
但是,需要注意避免无限嵌套,以防止出现死循环。
4.宏的可见性:宏定义通常是在头文件中定义的,因此需要在包含该头文件的源文件中可见。
如果需要在多个源文件中使用相同的宏定义,可以将宏定义放在公共头文件中,并在需要使用的源文件中包含该头文件。
5.宏的副作用:宏替换是在预处理阶段进行的,因此宏定义可能会产生一些副作用,例如修改全局变量或引入新的依赖关系。
在使用宏时,需要仔细考虑其副作用,并确保代码的正确性和稳定性。
6.避免使用不确定的表达式:在使用宏时,应避免使用不确定的表达式或难以预测的结果。
否则,可能会导致编译错误或不可预期的行为。
7.保留字的使用:在使用宏时,需要特别注意保留字的使用。
由于预处理器会将宏名展开为实际的代码,因此使用保留字作为宏名可能会导致意外的结果或错误。
建议使用描述性名称作为宏名,以避免混淆和错误。
C语言中的宏定义

下面是预处理后的这条语句:
1. n=((i)>(((j)>(k)?(j):(k)))?(i):(((j)>(k)?(j):(k))));
2) 、宏参数没有类型检查。当一个函数被调用时,编译器会检查每一个参数来确认它们是 否是正确的类型。如果不是,或者将参数转换成正确的类型,或者由编译器产生一个出错信 息。预处理器不会检查宏参数的类型,也不会进行类型转换。 3) 、无法用一个指针来指向一个宏。如在 17.7 节中将看到的,C 语言允许指针指向函数。 这一概念在特定的编程条件下非常有用。 宏会在预处理过程中被删除, 所以不存在类似的 “指 向宏的指针”。因此,宏不能用于处理这些情况。 4) 、宏可能会不止一次地计算它的参数。函数对它的参数只会计算一次,而宏可能会计算 两次甚至更多次。如果参数有副作用,多次计算参数的值可能会产生意外的结果。考虑下面 的例子,其中 MAX 的一个参数有副作用:
1. #define getchar() getc(stdin)
空的参数列表不是一定确实需要, 但可以使 getchar 更像一个函数。 (没错, 这就是<stdio.h> 中的 getchar,getchar 的确就是个宏,不是函数 ——虽然它的功能像个函数。) 使用带参数的宏替代实际的函数的优点: 1) 、 程序可能会稍微快些。一个函数调用在执行时通常会有些额外开销—— 存储上下文 信息、复制参数的值等。而一个宏的调用则没有这些运行开销。 2) 、 宏会更“通用”。与函数的参数不同,宏的参数没有类型。因此,只要预处理后的程序 依然是合法的,宏可以接受任何类型的参数。例如,我们可以使用 MAX 宏从两个数中选出 较大的一个,数的类型可以是 int,long int,float,double 等等。 但是带参数的宏也有一些缺点。
c语言 函数宏替换方案

c语言函数宏替换方案1.引言1.1 概述概述部分的内容可以是对函数宏替换方案的简要介绍和背景说明。
以下是一个可能的概述部分的内容:概述:在C语言中,函数宏是一种非常有用的编程工具,它可以在代码中实现简单的代码替换,从而提高代码的可读性和重用性。
函数宏替换是C语言中的一项重要特性,它允许开发人员定义一个类似函数的宏,并在代码中使用这个宏来实现一系列的操作。
函数宏的替换是在预处理阶段完成的,在代码被编译之前,预处理器会将函数宏的定义替换为实际的代码。
本文将详细介绍函数宏替换的基本语法和规则,以及函数宏替换的优势和应用场景。
了解函数宏替换的使用方法和注意事项,可以帮助开发人员更好地理解和运用这一强大的编程技巧。
通过合理使用函数宏替换,我们可以提高代码的可读性、减少代码的重复性,并提高程序的性能和效率。
在接下来的章节中,将对函数宏替换的概念和作用进行详细介绍,然后探讨函数宏替换的基本语法和规则。
最后,将对函数宏替换的优势和应用场景进行分析,并总结本文的主要内容。
让我们开始探索函数宏替换方案吧!1.2文章结构1.2 文章结构本文主要围绕函数宏替换展开讨论,文章结构如下:第一部分是引言部分。
首先,概述函数宏替换的概念和作用,介绍函数宏替换在C语言中的重要性和应用场景。
然后,明确本文的目的,即探讨函数宏替换的基本语法和规则,并分析其优势和应用场景。
第二部分是正文部分。
首先,介绍函数宏替换的概念和作用,探讨其在C语言中的应用场景和重要性。
然后,详细介绍函数宏替换的基本语法和规则,包括定义函数宏、带有参数的函数宏、多行函数宏等。
通过实例的方式,逐步讲解函数宏替换的具体用法和注意事项。
第三部分是结论部分。
首先,总结函数宏替换的优势和适用场景,强调其在代码编写和维护中的重要性。
然后,对全文进行总结,简要回顾了本文的主要内容和观点。
通过以上的文章结构,读者可以了解到函数宏替换的概念和作用,掌握其基本的语法和规则,并了解函数宏替换的优势和应用场景。
C语言中的宏定义用法

C语言中的宏定义用法宏定义是C语言中一种重要的预处理指令,通过宏定义可以为一些常用的代码片段或数值指定名称,方便程序开发和维护。
本文将介绍C语言中宏定义的用法和注意事项。
首先,在C语言中,宏定义使用“#define”关键字进行定义,其语法格式为:```#define 宏名称值```其中,宏名称是自定义的标识符,可以是任意有效的变量名或符号;值可以是任意的表达式、常量或代码片段。
通过宏定义,我们可以将一些重复使用的代码片段定义为宏,以提高代码的重用性和可读性。
在使用宏定义时,需要注意以下几点:1. 宏定义不需要分号结尾,直接写在宏定义行即可。
2. 宏名称一般使用大写字母表示,以区分于普通变量。
3. 宏定义的值可以是任意合法的C语句,但最好使用括号将其括起来,防止优先级问题。
4. 宏定义中可以使用参数,以实现不同场景下的值替换。
除了定义普通的宏之外,C语言中还有一种特殊的宏定义“#define MAX(a, b) ((a) > (b) ? (a) : (b))”,这种宏定义被称为宏函数,可以实现简单的函数功能。
宏函数通常使用括号将参数括起来,以确保表达式的正确性。
另外,C语言中还有一些系统预定义的宏,如“__FILE__”表示当前文件名,“__LINE__”表示当前行号,“__FUNCTION__”表示当前函数名等。
这些宏可以在调试和错误提示时起到一定的作用,方便程序员定位问题。
在使用宏定义时,需要注意一些潜在的问题,如:1. 宏定义的替换是简单的文本替换,可能会产生一些意外的结果。
2. 宏定义带来的代码重复可能会增加代码的长度,降低代码的可读性。
3. 在调试时,宏定义会隐藏实际代码逻辑,导致调试困难。
综上所述,C语言中的宏定义是一种方便而强大的工具,可以提高代码的可维护性和可读性。
在使用宏定义时,需要注意语法规范和潜在的问题,以充分发挥其优势。
通过合理地运用宏定义,可以使程序更加简洁高效,提升开发效率。
c语言宏定义格式
c语言宏定义格式C语言宏定义格式C语言中的宏定义是一种预处理指令,它可以将一些常用的代码片段定义为一个宏,以便在程序中多次使用。
宏定义的格式如下:#define 宏名替换文本其中,宏名是定义的宏的名称,替换文本是宏定义的内容。
宏名可以是任何合法的标识符,但是不能是C语言的关键字或保留字。
替换文本可以是任何合法的C语言代码,包括表达式、语句、函数等。
宏定义的作用是将一些常用的代码片段定义为一个宏,以便在程序中多次使用。
例如,我们可以定义一个求平方的宏:#define SQUARE(x) ((x)*(x))这个宏定义了一个名为SQUARE的宏,它的替换文本是一个表达式,用来求一个数的平方。
在程序中,我们可以使用这个宏来求任何一个数的平方,例如:int a = 5;int b = SQUARE(a);在这个例子中,宏SQUARE被展开为((a)*(a)),所以b的值为25。
宏定义还可以带参数,例如:#define MAX(x,y) ((x)>(y)?(x):(y))这个宏定义了一个名为MAX的宏,它的替换文本是一个表达式,用来求两个数中的最大值。
在程序中,我们可以使用这个宏来求任何两个数中的最大值,例如:int a = 5;int b = 7;int c = MAX(a,b);在这个例子中,宏MAX被展开为((a)>(b)?(a):(b)),所以c的值为7。
宏定义还可以使用条件编译指令,例如:#ifdef DEBUG#define DEBUG_PRINT(x) printf x#else#define DEBUG_PRINT(x)#endif这个宏定义了一个名为DEBUG_PRINT的宏,它的替换文本是一个printf语句。
在程序中,如果定义了DEBUG宏,则可以使用DEBUG_PRINT来输出调试信息,例如:#define DEBUGDEBUG_PRINT(("a=%d,b=%d\n",a,b));在这个例子中,宏DEBUG_PRINT被展开为printf(("a=%d,b=%d\n",a,b)),所以输出a和b的值。
c语言中常用的宏定义
c语言中常用的宏定义C语言中常用的宏定义在C语言中,宏定义是一种预处理指令,用于在编译前将代码中的标识符替换为指定的文本。
宏定义可以提高代码的可读性和可维护性,减少代码的重复性,提高开发效率。
下面将介绍一些常用的宏定义。
1. #define#define是C语言中最常用的宏定义指令之一,用于定义一个宏。
它的基本语法为:#define 宏名替换文本宏名可以是任意合法的标识符,替换文本可以是任意合法的C代码。
当程序中出现宏名时,预处理器会将其替换为相应的文本。
2. #ifdef / #ifndef / #endif这三个宏定义指令用于条件编译。
#ifdef用于检查一个宏是否已经定义,#ifndef则用于检查一个宏是否未定义。
如果条件成立,接下来的代码将被编译,否则将被忽略。
#endif用于结束条件编译指令的范围。
3. #if / #elif / #else这些宏定义指令也用于条件编译。
#if用于判断一个常量表达式的值是否为真,如果为真,则接下来的代码将被编译。
#elif用于在多个条件中选择一个进行编译,如果前面的条件不成立,则判断下一个条件。
#else用于指定当前面的条件都不成立时要编译的代码。
4. #undef#undef用于取消一个已定义的宏。
当不再需要某个宏时,可以使用#undef将其取消定义。
5. #include#include是C语言中用于包含头文件的宏定义指令。
头文件中通常包含了一些函数的声明、宏定义和结构体的定义等。
使用#include 可以将头文件的内容插入到当前文件中。
6. #pragma#pragma是一种特殊的宏定义指令,它用于控制编译器的行为。
不同的编译器支持的#pragma指令有所不同,常用的#pragma指令有#pragma once(用于防止头文件的重复包含)、#pragma warning(用于控制编译器的警告信息)等。
7. #line#line用于修改编译器产生的行号和文件名。
C语言常用宏定义技巧
#define MEM_W(x) (*((uint16 *)(x)))
注:类似于这种有多个字符串组成的宏定义一定要注意加上“()”,因为我们知道宏定义只是一种简单的字符替换功能。
4. 求最大值和最小值:
#define MAX(x,y) (((x)>(y))?(x):(y))
constructor
13. 冒泡排序算法的时间复杂度是什么?
O(n^2)
14. 写出float x 与“零值”比较的if语句。
if(x>0.000001&&x<-0.000001)
16. Internet采用哪种网络协议?该协议的主要层次结构?
tcp/ip 应用层/传输层/网络层/数据链路层/物理层
{
FLOPW(ray,val)
}
else
Hale Waihona Puke { } 8. 得到一个变量的地址:
#define B_PTR(var) ((byte *)(void *)&(var))
#define W_PTR(var) ((word *)(void *)&(var))
C语言常用宏定义技巧
2
推荐 C语言常用宏定义技巧
用C语言编程,宏定义是个很重要的编程技巧。用好了宏定义,它可以增强程序的可读性、可移植性、方便性、灵活性等等。
1. 防止一个头文件被重复包含:
#ifndef COMDEF_H
#define COMDEF_H
#define FLOPW(ray,val) do{ (ray)[0]=((val)/256); (ray)[1] =((val)&0xFF);}while(0)
c语言常用宏定义的用法介绍
c语言常用宏定义的用法介绍宏是C语言中常用的编译预处理功能之一。
在编程时,可以使用宏来代替一些常量或表达式,给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率。
另外,在C语言中,宏是产生内嵌代码的唯一方法,并且可以定义带参数的宏,对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。
但是如果对宏命令本质理解不透彻,在使用时可能运行的结果与预期的结果就会大相径庭。
下面具体介绍C语言中宏的使用(即宏定义、宏调用、宏展开)。
在C语言源程序中,允许用一个标识符表示一个字符串,称为“宏”;被定义为宏的标识符称为“宏名”。
宏定义是由源程序中的宏定义命令完成的。
该命令有两种形式:一种是无参数的宏定义;另外一种是带参数的宏定义。
(一)无参数的宏定义无参数宏的宏名后不带参数。
其定义的一般形式为:#define标识符字符串#是预处理命令的标志,define是宏定义命令的标志。
标识符为宏名,字符串可以是常量、表达式、格式串等。
例如:#definePI3.1415926#defineSUM(1+2)(二)带参数的宏定义带参数的宏定义,也称为宏函数,在宏定义中的参数称为形式参数,形式参数不分配内存单元,所以不必作类型定义。
带参数的宏定义的一般— 1 —形式如下:#define宏名(参数表)宏体例如:#defineAREAR(R)3.14*R*R#defineSUM(X,Y)X+Y两种格式的宏定义必须写在函数的外边,其作用域为宏定义命令起到源程序结束,若要终止其作用域可以用#undef命令加宏名,宏定义也允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。
(一)宏展开及调用的概念编译预处理时程序中出现的所有宏名都要有宏定义中的字符串来代换,称为宏展开。
嵌套的宏定义,展开时要层层展开。
程序中字符串内的字符跟宏名相同时作为一般字符处理,不用宏展开。
对于带参数的宏的使用称为宏调用,一般形式为:宏名(实参表);在调用中,不仅要宏展开,而且要用实参去代换形参。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 防止一个头文件被重复包含
#ifndef __HEAD_H__
#define __HEAD_H__
//头文件内容
#endif
2 重新定义类型
--防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
typedef unsigned char boolean; /* Boolean value type. */
typedef unsigned long int uint32; /* Unsigned 32 bit value */
typedef unsigned short uint16; /* Unsigned 16 bit value */
typedef unsigned char uint8; /* Unsigned 8 bit value */
typedef signed long int int32; /* Signed 32 bit value */
typedef signed short int16; /* Signed 16 bit value */
typedef signed char int8; /* Signed 8 bit value */
//下面的不建议使用
typedef unsigned char byte; /* Unsigned 8 bit value type. */ typedef unsigned short word; /* Unsinged 16 bit value type. */ typedef unsigned long dword; /* Unsigned 32 bit value type. */
typedef unsigned char uint1; /* Unsigned 8 bit value type. */ typedef unsigned short uint2; /* Unsigned 16 bit value type. */ typedef unsigned long uint4; /* Unsigned 32 bit value type. */
typedef signed char int1; /* Signed 8 bit value type. */ typedef signed short int2; /* Signed 16 bit value type. */ typedef long int int4; /* Signed 32 bit value type. */
typedef signed long sint31; /* Signed 32 bit value */
typedef signed short sint15; /* Signed 16 bit value */
typedef signed char sint7; /* Signed 8 bit value */
3 得到指定地址上的一个字节或字
#define MEM_B( x ) ( *( (byte *) (x) ) )
#define MEM_W( x ) ( *( (word *) (x) ) )
4 求最大值和最小值
#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )
5 得到一个field在结构体(struct)中的偏移量
#define FPOS( type, field ) \
/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */
6 得到一个结构体中field所占用的字节数
#define FSIZ( type, field ) sizeof( ((type *) 0)->field )
7 按照LSB格式把两个字节转化为一个Word #define FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )
8 按照LSB格式把一个Word转化为两个字节
#define FLOPW( ray, val ) \
(ray)[0] = ((val) / 256); \
(ray)[1] = ((val) & 0xFF)
9 得到一个变量的地址(word宽度)
#define B_PTR( var ) ( (byte *) (void *) &(var) )
#define W_PTR( var ) ( (word *) (void *) &(var) )
10 得到一个字的高位和低位字节
#define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))
#define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))
11 返回一个比X大的最接近的8的倍数
#define RND8( x ) ((((x) + 7) / 8 ) * 8 )
12 将一个字母转换为大写
#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )
13 判断字符是不是10进值的数字
#define DECCHK( c ) ((c) >= '0' && (c) <= '9')
14 判断字符是不是16进值的数字
#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\
((c) >= 'A' && (c) <= 'F') ||\
((c) >= 'a' && (c) <= 'f') )
15 防止溢出的一个方法
#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
16 返回数组元素的个数
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
17 返回一个无符号数n尾的值
MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)
#define MOD_BY_POWER_OF_TWO( val, mod_by ) \
( (dword)(val) & (dword)((mod_by)-1) )
18 对于IO空间映射在存储空间的结构,输入输出处理
#define inp(port) (*((volatile byte *) (port)))
#define inpw(port) (*((volatile word *) (port)))
#define inpdw(port) (*((volatile dword *)(port)))
#define outp(port, val) (*((volatile byte *) (port)) = ((byte) (val)))
#define outpw(port, val) (*((volatile word *) (port)) = ((word) (val)))
#define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))
19 使用一些宏跟踪调试
A N S I标准说明了五个预定义的宏名。
它们是:
_ L I N E _
_ F I L E _
_ D A T E _
_ T I M E _
_ S T D C _
如果编译不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。
记住编译程序
也许还提供其它预定义的宏名。
_ L I N E _及_ F I L E _宏指令在有关# l i n e的部分中已讨论,这里讨论其余的宏名。
_ D AT E _宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。
源代码翻译到目标代码的时间作为串包含在_ T I M E _中。
串形式为时:分:秒。
如果实现是标准的,则宏_ S T D C _含有十进制常量1。
如果它含有任何其它数,则实现是非标准的。
可以定义宏,例如:
当定义了_DEBUG,输出数据信息和所在文件所在行
#ifdef _DEBUG
#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)
#else
#define DEBUGMSG(msg,date)
#endif
20 宏定义防止使用是错误
用小括号包含。
例如:#define ADD(a,b) (a+b)
用do{}while(0)语句包含多语句防止错误
例如:#difne DO(a,b) a+b;a++;
应用时:if(⋯.)
DO(a,b); //产生错误
else
解决方法: #difne DO(a,b) do{a+b;a++;}while(0) 21 设置输出错误宏定义。